题目描述
题目链接:21. 合并两个有序链表 - 力扣(LeetCode)
题目分析
这个算法思路很简单:就是直接找小尾插
定义一个tail和head,对比两个链表结点的val,小的尾插到tail->next,如果一个链表先走完,就把另外一个链表尾插到tail->next,最后返回head就行
具体的流程就是:
有一个特殊情况就是:如果list1和list2有一个为空的话,那就直接返回另外一个链表
代码示例
有了思路,我们就可以写代码了:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
if(list1==NULL)
return list2;
if(list2==NULL)
return list1;
struct ListNode*tail=NULL,*head=NULL;
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;
}
这个题就解决了: