将两个非递减的有序链表合并为一个非递增的有序链表, 如何实现? 要求结果链表仍使用原来两个链表的存储空间,不另外占用其它的存储空间。 表中允许有重复的数据。c语言实现
时间: 2024-09-24 17:10:21 浏览: 62
在C语言中,合并两个非递减有序链表并保持非递增顺序,我们可以使用迭代的方式来实现,同时尽量利用原链表的节点避免额外内存开销。下面是一种可能的实现方法:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode {
int val;
struct ListNode* next;
} ListNode;
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode dummy(0, NULL);
ListNode* tail = &dummy; // 初始化虚拟尾巴指针
while (l1 != NULL && l2 != NULL) {
if (l1->val <= l2->val) { // 当前l1较小或相等
tail->next = l1;
l1 = l1->next;
} else { // 当前l2较小或相等
tail->next = l2;
l2 = l2->next;
}
tail = tail->next; // 更新尾部指针
}
// 将剩余链表连接到尾部
if (l1 != NULL) {
tail->next = l1;
} else {
tail->next = l2;
}
return dummy.next; // 返回合并后的链表头
}
// 测试函数
void printList(ListNode* head) {
while (head != NULL) {
printf("%d -> ", head->val);
head = head->next;
}
printf("NULL\n");
}
int main() {
// 例子:l1 = [1, 2, 3],l2 = [2, 4, 5]
ListNode* l1 = malloc(sizeof(ListNode));
l1->val = 1;
l1->next = malloc(sizeof(ListNode));
l1->next->val = 2;
l1->next->next = malloc(sizeof(ListNode));
l1->next->next->val = 3;
l1->next->next->next = NULL;
ListNode* l2 = malloc(sizeof(ListNode));
l2->val = 2;
l2->next = malloc(sizeof(ListNode));
l2->next->val = 4;
l2->next->next = malloc(sizeof(ListNode));
l2->next->next->val = 5;
l2->next->next->next = NULL;
ListNode* mergedList = mergeTwoLists(l1, l2);
printList(mergedList);
return 0;
}
```
上述代码首先创建了一个虚拟头节点`dummy`,然后通过比较`l1`和`l2`的值来决定将哪个节点添加到新的链表中。最后返回`dummy.next`作为新的合并链表的头。
阅读全文