題目內容
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 將k個已排好序的鏈表歸併爲一個序列。
題目分析
首先想到的是實現歸併兩個排好序的序列,這裏採用最簡單的方法,將兩個序列的數從頭到尾開始一一比較放進一個新的序列。
然後實現歸併K個序列,這裏採用分治的思想,把k個序列分爲兩部分,繼續劃分,直到剩餘兩個序列,再把它們歸併在一起。這裏參考了leetcode上面discuss的一個做法,直接把list的前兩個序列歸併成一個新的序列放在list末端,然後刪除這兩個序列,以此類推,直到最後只剩下一個序列就是答案了,個人感覺這種方法實現起來比較簡單。
代碼實現
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.size() == 0){
return nullptr;
}
while(lists.size() > 1){
lists.push_back(merge2list(lists[0],lists[1]));
lists.erase(lists.begin());
lists.erase(lists.begin());
}
return lists[0];
}
ListNode* merge2list(ListNode*l1, ListNode*l2){
if(l1 == nullptr){
return l2;
}
if(l2 == nullptr){
return l1;
}
ListNode* result, *p;
if(l1->val > l2->val){
result = l2;
l2 = l2->next;
}else{
result = l1;
l1 = l1->next;
}
p = result;
while(l1 != nullptr && l2 != nullptr){
if(l1->val > l2->val){
p->next = l2;
l2 = l2->next;
}else{
p->next = l1;
l1 = l1->next;
}
p = p->next;
}
if(l1 != nullptr){
p->next = l1;
}
if(l2 != nullptr){
p->next = l2;
}
return result;
}
};