LeetCode 21.合并有序链表
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
以第一个元素小的链表作为主链,将另一个链表的元素依次插入主链表。
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if(l1==NULL&&l2==NULL)return NULL;//如果两个参数为空指针,则返回NULL
else if(l1==NULL)return l2;//如果其中一个参数为空,则返回另一个链表
else if(l2==NULL)return l1;
if(l1->val<=l2->val)//判断两个链表那个是主链表
{
return LINKlist(l1,l2);
}
else
return LINKlist(l2,l1);
}
ListNode* LINKlist(ListNode* l1, ListNode* l2)//l1为主链表,l2为辅助链表
{
ListNode *first=l1,*index=l1->next;//前一个元素,当前元素。
while(l2!=NULL)//当辅助链表的元素全部插入主链表,跳出循环
{
if(first->next==NULL)//主链表的全部元素使用完,将辅助链表直接连接到主链表尾部
{
first->next=l2;
break;
}
if(index->val>=l2->val)//如果当前元素比辅助链表的首元素大,则将辅助链表的首元素插入当前元素之前
{
first->next=l2;
l2=l2->next;
first=first->next;
first->next=index;
}
else{//如果当前元素比辅助链表的首元素小,则指针跳转到下一元素
first=index;
index=index->next;
}
}
return l1;
}
};
时间复杂度O(n)
1.判段条件错误:在index->next==NULL
时当前指针还是存在元素的。不能直接与另一链表相连。
2.循环条件错误:应该为l2!=NULL
,如果像下图一样会导致,l2链表的最后一个元素丢失。
3.没有参数是空指针的处理方法