题目描述(来源)
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
思路
需创建一个头结点,然后从两个链表的表头开始依次比较传入的两个链表的结点的大小,并将两个链表中较小的结点尾插到新链表的后面即可。
struct ListNode
{
int val;
struct ListNode *next;
};
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
// 申请一个新的临时头节点,作为合并后链表的起始点,不存储有效数据
struct ListNode* guard = (struct ListNode*)malloc(sizeof(struct ListNode));
// 初始化尾指针,指向临时头节点,用于构建新的有序链表
struct ListNode* cur = guard;
// 初始化两个指针分别指向待合并链表l1和l2的当前节点
struct ListNode* cur1 = list1;
struct ListNode* cur2 = list2;
// 当两个链表均未遍历完时执行循环
while (cur1 && cur2)
{
// 比较当前节点的值,将较小节点链接到新链表的尾部
if (cur1->val < cur2->val)
{
cur->next = cur1;
// 移动l1的当前节点指针到下一个节点
cur1 = cur1->next;
}
else
{
cur->next = cur2;
// 移动l2的当前节点指针到下一个节点
cur2 = cur2->next;
}
// 更新尾指针,使其始终指向新链表的最后一个节点
cur = cur->next;
}
// 将未遍历完的链表剩余部分链接到新链表的尾部
if (cur1) cur->next = cur1;
else cur->next = cur2;
// 新链表的头指针指向临时头节点的下一个节点,即最小值节点
struct ListNode* head = guard->next;
// 释放临时头节点,无需在最终链表中保留
free(guard);
// 返回合并后的新链表头指针
return head;
}