请用C语言编写一个将两个递增的链表合成一个递增链表的函数
时间: 2023-08-04 18:33:30 浏览: 105
好的,以下是一个用 C 语言实现的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int val;
struct ListNode *next;
};
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
// 如果其中一个链表为空,则返回另一个链表
if (!l1) {
return l2;
}
if (!l2) {
return l1;
}
// 创建一个哑结点,用于最后返回合并后的链表
struct ListNode *dummy = malloc(sizeof(struct ListNode));
dummy->val = 0;
dummy->next = NULL;
struct ListNode *tail = dummy;
// 遍历两个链表,将值较小的节点加入到新链表中,并将指针向后移动
while (l1 && l2) {
if (l1->val < l2->val) {
tail->next = l1;
l1 = l1->next;
} else {
tail->next = l2;
l2 = l2->next;
}
tail = tail->next;
}
// 将剩余的节点加入到新链表中
if (l1) {
tail->next = l1;
}
if (l2) {
tail->next = l2;
}
// 返回合并后的链表(注意,哑结点的 next 才是真正的链表头)
struct ListNode *res = dummy->next;
free(dummy);
return res;
}
```
这个函数的时间复杂度为 $O(m+n)$,其中 $m$ 和 $n$ 分别是两个链表的长度。请注意,在函数返回前,需要手动释放创建的哑结点的内存。
阅读全文