21. 合并两个有序链表 - 力扣(LeetCode) (leetcode-cn.com)
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

创建结构体变量,用来接收比较完的节点,从头比较两个单链表,小的放在创建的结构体变量后面;相当于尾插,知道一方到尾,再把剩下的一方链到尾节点,返回首节点;
注意细节:
1.要再定义两个结构体变量,记录排好的链表首节点,另一个记录链表的尾节点,以便于尾插;
2.检查给的两个链表是否有空;
3.可以建立一个哨兵位的头,这样就不用先确定头节点了;
答案1:
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
//判断是否为空;如果有直接返回另一个链表
if (!l1)
{
return l2;
}
if (!l2)
{
return l1;
}
//创建两个结构体变量;
struct ListNode* res = NULL, *cur = NULL;
//比较一个较小的节点,来充当排序后的首节点
if (l1->val <l2->val)
{
cur = l1;
l1 = l1->next;
}
else
{
cur = l2;
l2 = l2->next;
}
res = cur;
//依次遍历,直到有一个链表到尾
while (l1&&l2)
{
if (l1->val <l2->val)
{
cur->next = l1;
l1 = l1->next;
cur = cur->next;
}
else
{
cur->next = l2;
l2 = l2->next;
cur = cur->next;
}
}
//判断链表,把没到空的链表,链接到排好的后面;
if (l1)
{
cur->next = l1;
}
else
{
cur->next = l2;
}
//返回结果
return res;
}
答案2(哨兵位):
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
//判断是否为空;如果有直接返回另一个链表
if (!l1)
{
return l2;
}
if (!l2)
{
return l1;
}
//建立一个哨兵位头结点,哨兵位没有数据;后面要销毁;
struct ListNode* res = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* cur = res;
//依次遍历,直到有一个链表到尾
while (l1&&l2)
{
if (l1->val <l2->val)
{
cur->next = l1;
l1 = l1->next;
cur = cur->next;
}
else
{
cur->next = l2;
l2 = l2->next;
cur = cur->next;
}
}
//判断链表,把没到空的链表,链接到排好的后面;
if (l1)
{
cur->next = l1;
}
else
{
cur->next = l2;
}
//哨兵位头结点不可用,要返回第二个节点
struct ListNode* ret = res->next;
free(res);
//返回结果
return ret;
}
本文介绍了如何合并两个已排序的无头单链表,通过比较节点值并进行尾部插入来创建新的有序链表。详细讨论了实现过程中需要注意的细节,包括处理空链表的情况以及使用哨兵节点简化问题。
1582

被折叠的 条评论
为什么被折叠?



