请设计一个算法并编程实现:将两个递增的有序链表合并为一个递增的有序链表。要求结果链表仍使用原来两个链表的存储空间,不另外占用其他的存储空间。表中不允许有重复的数据。要使用c语言
时间: 2024-11-18 20:27:36 浏览: 25
为了合并两个递增的有序链表,你可以创建一个新的链表节点,并按照从小到大的顺序连接它们。以下是使用 C 语言的解决方案:
```c
#include <stdio.h>
#include <stdlib.h>
// 链表节点结构体
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 创建新节点
ListNode* createNode(int val) {
ListNode *node = (ListNode*)malloc(sizeof(ListNode));
node->val = val;
node->next = NULL;
return node;
}
// 合并两个有序链表
ListNode* mergeSortedLists(ListNode* list1, ListNode* list2) {
if (!list1 && !list2) {
return NULL; // 如果两个链表都为空,直接返回
}
if (!list1 || (!list2 && list1->val <= list2->val)) { // 如果只有一个链表,或者第一个链表当前节点值小于等于第二个链表
return list1;
} else if (!list2 || list1->val > list2->val) { // 如果第二个链表当前节点值大于第一个链表
ListNode *temp = list2;
list2 = list2->next;
temp->next = list1;
return mergeSortedLists(list1, list2);
} else {
ListNode *temp1 = list1;
ListNode *temp2 = list2;
while (temp1->next && temp2->next && temp1->next->val < temp2->next->val) {
temp1 = temp1->next;
}
temp1->next = temp2->next;
list2 = temp2->next;
temp2->next = NULL;
return mergeSortedLists(temp1, list2);
}
}
// 打印链表
void printList(ListNode* head) {
while (head) {
printf("%d -> ", head->val);
head = head->next;
}
printf("NULL\n");
}
int main() {
// 创建两个示例链表
ListNode* list1 = createNode(1);
list1->next = createNode(4);
list1->next->next = createNode(5);
ListNode* list2 = createNode(2);
list2->next = createNode(6);
list2->next->next = createNode(8);
// 合并链表
ListNode* mergedList = mergeSortedLists(list1, list2);
// 打印结果
printList(mergedList);
return 0;
}
```
这个程序首先检查两个链表是否有一个为空或其中一个链表的第一个节点值已经比另一个大,然后逐个比较节点,将较小的节点添加到结果链表中。最后,`main` 函数中创建了两个示例链表并打印出合并后的链表。
阅读全文