1.题目
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
将k个有序链表合并成一个有序链表。
2.思路
自然而然的联想到前面的merge 2 sorted lists.
第一次想法是,将链表逐个比较合并,结果自然而然的超时了。
class Solution {
public:
ListNode* mergeTwoLists(ListNode* a, ListNode* b) {
ListNode* p1 = a;
ListNode* p2 = b;
ListNode* newhead = new ListNode(-1);
ListNode* c = newhead;
while(p1&&p2){
if(p1->val < p2->val){
c->next = p1;
c = c->next;
p1=p1->next;
}
else{
c->next = p2;
c=c->next;
p2 = p2->next;
}
}
while(p1){c->next = p1;p1 = p1->next;c = c->next;}
while(p2){c->next = p2;p2 = p2->next;c = c->next;}
return newhead->next;
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.size() == 0) return NULL;
if(lists.size() == 1) return lists[0];
ListNode* ans = lists[0];
for(int i = 1; i < lists.size(); i++){
mergeTwoLists(ans,lists[i]);
}
return ans;
}
};
接着,对以上代码做了改进,不能逐个比较,太费时间了。联想到归并排序。。。
class Solution { // Runtime: 376 ms
public:
ListNode* mergeTwoLists(ListNode* a, ListNode* b) {
if(a==NULL) return b;
if(b==NULL) return a;
ListNode* p1 = a;
ListNode* p2 = b;
ListNode* newhead = new ListNode(-1);
ListNode* c = newhead;
while(p1&&p2){
if(p1->val < p2->val){
c->next = p1;
c = c->next;
p1=p1->next;
}
else{
c->next = p2;
c=c->next;
p2 = p2->next;
}
}
while(p1){c->next = p1;p1 = p1->next;c = c->next;}
while(p2){c->next = p2;p2 = p2->next;c = c->next;}
return newhead->next;
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
if (lists.empty()) return NULL;
int n = lists.size();
while (n > 1) {
for (int i = 0; i < n / 2; i++)
lists[i] = mergeTwoLists(lists[i], lists[n - 1 - i]);
n = (n + 1) / 2;
}
return lists[0];
}
};