问题描述:
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
Example:
Input:
[
1->4->5,
1->3->4,
2->6
]
Output: 1->1->2->3->4->4->5->6
题源:here;完整代码:here
思路:
在LeetCode上的解答中(here)一共给出了五种不同的解法。我选择了其中较容易实现并且复杂度较低的一种:合并法。顾名思义,就是将输入的序列两两合并,其合并的结果又两两合并,直到只有一个为止,如下图所示(引用自:here)。
代码
ListNode * merge2(ListNode *l1, ListNode *l2){
ListNode result(0), *curr;
curr = &result;
while (l1 && l2){
if (l1->val < l2->val){
curr->next = l1;
curr = curr->next;
l1 = l1->next;
}
else{
curr->next = l2;
curr = curr->next;
l2 = l2->next;
}
}
curr->next = l1 ? l1 : l2;
return result.next;
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
if (lists.size() == 0) return NULL;
while (lists.size() > 1){
vector<ListNode*> temp_lists;
for (int i = 0; i < lists.size() / 2; i++){
ListNode* temp = merge2(lists[2*i], lists[2*i + 1]);
temp_lists.push_back(temp);
}
if (lists.size() % 2) temp_lists.push_back(lists[lists.size() - 1]);
lists = temp_lists;
}
return lists[0];
}