36. 合并两个排序的链表
算法
(二路归并) O(n)
1.新建头部的保护结点dummy,设置cur指针指向dummy。
2.若当前l1指针指向的结点的值val比l2指针指向的结点的值val小,则令cur的next指针指向l1,且l1后移;否则指向l2,且l2后移。
3.然后cur指针按照上一部设置好的位置后移。
4.循环以上步骤直到l1或l2为空。
5.将剩余的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) {
ListNode *dummy = new ListNode(0);
ListNode *cur = dummy;
while(l1 && l2){
if(l1->val < l2->val)
{
cur->next = l1;
l1 = l1->next;
}
else
{
cur->next = l2;
l2 = l2->next;
}
cur = cur->next;//指完之后把cur向后移动一个
}
//判断是l1空了,还是l2空了,再把剩下的链表元素拼上。怎么拼?一个一个拼上?
//看了代码,直接是通过cur->next把剩下的元素拼接上了
//cur -> next = (l1 != NULL ? l1 : l2);
//cout<<l1<<endl;
//cout << l2->val <<endl;
//cout << cur->val <<endl;
cur->next = (l1==NULL ? l2 : l1);
return dummy->next;
}
};
带女朋友搬家新家条件不好,累到女朋友了,让女朋友受苦了,特此明志:每天学习,明年这个时候(20190812)让女朋友住上大房子,永远年轻,永远热泪盈眶,很多人都是这样,他们都把自己当成身在梦中一样,浑浑噩噩地过日子,只有痛苦或爱或危险可以让他们重新感到这个世界的真实。