输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。
样例
输入:1->3->5 , 2->4->5
输出:1->2->3->4->5->5
分析:
二路归并的思想
新建头部的保护结点dummy,设置tail指针指向dummy。
若当前l1指针指向的结点的值val比l2指针指向的结点的值val小,则令cur的next指针指向l1,且l1后移;否则指向l2,且l2后移。
然后cur指针按照上一部设置好的位置后移。
循环以上步骤直到l1或l2为空。
将剩余的l1或l2接到cur指针后边。
时间复杂度
两个链表各遍历一次,所以时间复杂度为O(n)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* merge(ListNode* l1, ListNode* l2) {
//递归法:总共递归n层,需要o(n)的空间;时间复杂度o(n)
/*if(!l1) return l2;
if(!l2) return l2;
if(l1->val > l2->val) {
l2->next = merge(l2->next, l1);
return l2;
} else {
l1->next = merge(l1->next, l2);
return l1;
}*/
//归并
ListNode* dummy = new ListNode(-1);
ListNode* tail = dummy;
while (l1 && l2) {
if (l1->val >= l2->val) tail->next = l2, tail = l2, l2 = l2->next;
else tail->next = l1, tail = l1, l1 = l1->next;
}
if(l1) tail->next = l1;
if(l2) tail->next = l2;
return dummy->next;
}
};