标签:
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
思路:
可以先做21. Merge Two Sorted Lists。
方法一:每次递归归并lists中前2条列表,直到归并只剩1条列表。
方法二:首尾归并,每次归并后,lists规模减少一半。
注意,局部函数中的变量一般要先初始化!
代码:
方法一:
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode* mergeTwoLists(ListNode* a,ListNode* b){ 12 if(!a){ 13 return b; 14 } 15 if(!b){ 16 return a; 17 } 18 if(a->val>b->val){ 19 b->next=mergeTwoLists(a,b->next); 20 return b; 21 } 22 a->next=mergeTwoLists(a->next,b); 23 return a; 24 } 25 ListNode* mergeKLists(vector<ListNode*>& lists) { 26 ListNode* head=NULL;//一定要初始化!! 27 while(lists.size()>1){ 28 lists.push_back(mergeTwoLists(lists[0],lists[1])); 29 lists.erase(lists.begin()); 30 lists.erase(lists.begin()); 31 } 32 if(lists.size()){ 33 head=lists[0]; 34 } 35 return head; 36 } 37 };
方法二:
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode* mergeTwoLists(ListNode* a,ListNode* b){ 12 if(!a){ 13 return b; 14 } 15 if(!b){ 16 return a; 17 } 18 if(a->val>b->val){ 19 b->next=mergeTwoLists(a,b->next); 20 return b; 21 } 22 a->next=mergeTwoLists(a->next,b); 23 return a; 24 } 25 ListNode* mergeKLists(vector<ListNode*>& lists) { 26 if(lists.empty()){ 27 return NULL; 28 } 29 int len=lists.size(); 30 int b=0,e=len-1; 31 while(b<e){ 32 while(b<e){ 33 lists[b]=mergeTwoLists(lists[b],lists[e]); 34 b++; 35 e--; 36 } 37 b=0; 38 } 39 return lists[0]; 40 } 41 };
或者
1 class Solution { 2 public: 3 ListNode* mergeTwoLists(ListNode* a,ListNode* b){ 4 if(!a){ 5 return b; 6 } 7 if(!b){ 8 return a; 9 } 10 if(a->val>b->val){ 11 b->next=mergeTwoLists(a,b->next); 12 return b; 13 } 14 a->next=mergeTwoLists(a->next,b); 15 return a; 16 } 17 ListNode* mergeKLists(vector<ListNode*>& lists) { 18 vector<ListNode*> res; 19 int i; 20 for(i=0;i<lists.size();i++){ 21 if(lists[i]){ 22 res.push_back(lists[i]); 23 } 24 } 25 if(!res.size()){ 26 return NULL; 27 } 28 int len=res.size(); 29 while(len>1){ 30 //设len=2q或者2q+1 31 for(i=0;i<len/2;i++){//注意区分len是奇数还是偶数的情况 32 res[i]=mergeTwoLists(res[i],res[len-1-i]); 33 } 34 //此时len应该等于q(len为偶数)或者q+1(len为奇数) 35 len=(len+1)/2; 36 } 37 return res[0]; 38 } 39 };
Leetcode 23. Merge k Sorted Lists
标签:
原文地址:http://www.cnblogs.com/Deribs4/p/5658884.html