合并两个有序链表
题目链接
题目
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
两个链表的节点数目范围是 [0, 50]
-100 <= Node.val <= 100
l1 和 l2 均按非递减顺序排列
输入输出示例
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
示例 2:
输入:l1 = [], l2 = []
输出:[]
示例 3:
输入:l1 = [], l2 = [0]
输出:[0]
思路
用迭代法,设定两个指针最开始指向两个链表的头结点,比较两个指针所指结点数据域,选择较小的结点放入到合并链表,并移动被选择链表的指针到下一位置,重复至某一链表指针到达尾部,将另一序列剩下的所有元素直接复制到合并链表
参考代码1
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
struct ListNode *L,*r;//L返回的链表,r作为尾结点
L = (struct ListNode*)malloc(sizeof(struct ListNode));
L = NULL;
r = L;
while(list1!=NULL||list2!=NULL)
{
struct ListNode *p;
p = (struct ListNode*)malloc(sizeof(struct ListNode));
p->next = NULL;
//尾插法插入结点
if(list1!=NULL&&list2!=NULL)
{
if(list1->val < list2->val)
{
p->val = list1->val;
list1 = list1->next;
}
else
{
p->val = list2->val;
list2 = list2->next;
}
}
else if(list1==NULL)
{
p->val = list2->val;
list2 = list2->next;
}
else
{
p->val = list1->val;
list1 = list1->next;
}
if(r == NULL)
{
r = p;
L = r;
}
else
{
r->next = p;
r = p;
}
}
return L;
}
根据官方题解—>合并链表<—优化的代码
参考代码2
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
struct ListNode *L,*r;
L = (struct ListNode*)malloc(sizeof(struct ListNode));
r = (struct ListNode*)malloc(sizeof(struct ListNode));
r = L;
while (list1 != NULL && list2 != NULL)
{
if (list1->val < list2->val)
{
r->next = list1;
list1 = list1->next;
}
else
{
r->next = list2;
list2 = list2->next;
}
r = r->next;
}
r->next = list1 == NULL ? list2 : list1;//判断哪个链表还有结点,直接全部连接到合并链表尾部
return L->next;
}