力扣21:合并两个有序链表 **题目描述:**将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4] 示例 2:
输入:l1 = [], l2 = [] 输出:[] 示例 3:
输入:l1 = [], l2 = [0] 输出:[0]
提示:
两个链表的节点数目范围是 [0, 50] -100 <= Node.val <= 100 l1 和 l2 均按 非递减顺序 排列
分析:
创建一个新的链表,使用head记录新链表的头节点,tail记录新链表的尾节点,逐个比较list1的值和list2的值,较小的尾插到新的链表后面。
遍历,当list1、list2其中一个链表为空时,那么结束遍历。
当list1->val < list2->next,则list1尾插到新链表后面; 当list1->val > ist2->next,则list2尾插到新链表后面。
如果list1为空链表,那么直接返回list2链表; 反之,直接返回list1链表即可。
如果其中一个链表已经遍历完了,那么只需要将另一个链表全部尾插到新建的链表后面即可。
需要注意的是:在尾插时,刚开始新链表为空,需要判断一下新链表为空,然后使得待插元素为头节点,并且也是尾节点。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
struct ListNode*head=NULL,*tail=NULL;
if(list1==NULL)
return list2;
if(list2==NULL)
return list1;
while(list1&&list2)
{
if(list1->val<list2->val)
{
if(tail==NULL)
{
head=tail=list1;
}
else{
tail->next=list1;
tail=tail->next;
}
list1=list1->next;
}
else
{
if(tail==NULL)
{
head=tail=list2;
}
else{
tail->next=list2;
tail=tail->next;
}
list2=list2->next;
}
}
if(list1)
{
tail->next=list1;
}
if(list2)
{
tail->next=list2;
}
return head;
}