这一放,居然放了一个多月,上一题是11月3日的 19.Remove Nth Node From End of List
今天已经12月12日了,真是时不我待!原来不被管束已经一个多月了,我也是如此不自觉。想想如果这段时间我坚持每天做一题,现在的题号就是19+38=57了。。。
题目:Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
题解:(解法一)忘记是不是做过Merge 2 sorted linked lists 了,这题用之前Pin给我看的那篇简而化之的文章应该是挺好想到的。先考虑两个链表的情况,写个函数,再做k-1次。
刚开始没有考虑到可能存在空的链表,加了空链表判断后,不是写成现在的return l2;而是直接head=l2,最后再统一return head; 这样是错误的,因为后面有
if(l1!=NULL){ p->next=l1; }else if(l2!=NULL){ p->next=l2; }
的操作, 这时候 p 为 NULL,会出现Runtime Error.正确的做法是直接return.
if(l1==NULL) return l2; else if(l2==NULL) return l1;
(解法二)自已想的是 比较链表首部的k个数,对这k个数用堆排序或者快排,找到最小的那个数放到所求的链表中,记录最小数所在的链表,让该链表指针后移。比较N次。。发现还是挺麻烦的。
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode *mergeTwoLists(ListNode *l1,ListNode *l2) { ListNode *head=NULL; ListNode *p=NULL; if(l1==NULL) return l2; else if(l2==NULL) return l1; while(l1&&l2){ ListNode *temp=NULL; if(l1->val < l2->val){ temp=l1; l1=l1->next; }else{ temp=l2; l2=l2->next; } if(head==NULL){ head=temp; p=temp; }else{ p->next=temp; p=p->next; } } if(l1!=NULL){ p->next=l1; }else if(l2!=NULL){ p->next=l2; } return head; } ListNode *mergeKLists(vector<ListNode *> &lists) { if (lists.size()==0) return NULL; ListNode *head=lists[0]; for(int i=1;i<lists.size();i++){ head=mergeTwoLists(head,lists[i]); } return head; } };