2.C语言合并两个有序链表,接受两个有序链表的头节点,将这两个链表合并为一个有序链表,并返回合并后的链表头节点 struct ListNode{ int val ListNode* next; ListNode(int x);val(x),next(NULL){} };
时间: 2024-12-19 10:20:15 浏览: 27
在C语言中合并两个有序链表,可以采用递归或迭代的方式来实现。这里提供一种基于迭代的方法:
```c
// 定义一个辅助函数,用于比较两个链表节点的值
int compare(const struct ListNode* node1, const struct ListNode* node2) {
return (node1->val < node2->val) ? -1 : ((node1->val == node2->val) ? 0 : 1);
}
// 合并两个有序链表函数
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
// 创建一个新的头节点
struct ListNode* head = NULL;
struct ListNode* tail = NULL;
// 指针初始化,当其中一个链表为空时,另一个即为结果
if (l1 != NULL && l2 != NULL) {
// 遍历两个链表
while (l1 != NULL && l2 != NULL) {
// 使用compare函数确定下一个节点
if (compare(l1, l2) <= 0) {
// 如果l1节点较小或相等,将其加入新链表
if (head == NULL) {
head = l1;
tail = l1;
} else {
tail->next = l1;
tail = l1;
}
l1 = l1->next;
} else {
// 否则,l2节点较小,将其加入新链表
if (head == NULL) {
head = l2;
tail = l2;
} else {
tail->next = l2;
tail = l2;
}
l2 = l2->next;
}
}
}
// 将剩余未遍历完的链表添加到新链表尾部
if (l1 != NULL) {
tail->next = l1;
} else if (l2 != NULL) {
tail->next = l2;
}
return head;
}
```
这个函数首先创建一个空链表作为合并的结果。然后,它同时遍历两个输入链表,每次选择较小的节点插入到新链表中,直到其中一个链表遍历完毕。最后,将未遍历完的链表连接到已排序的新链表末尾。
阅读全文