23. 合併K個排序連結串列
阿新 • • 發佈:2018-12-11
合併 k 個排序連結串列,返回合併後的排序連結串列。請分析和描述演算法的複雜度。
示例:
輸入:
[
1->4->5,
1->3->4,
2->6
]
輸出: 1->1->2->3->4->4->5->6
分析:先合併兩個有序連結串列,然後再將先前合併的與剩餘的連結串列繼續兩兩合併。時間複雜度為O(logn)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.empty()) {
return NULL;
}
int n = lists.size();
while(n > 1) {
int k = (n + 1) / 2;
for(int i = 0; i < n / 2; i++) {
lists[ i] = merge2List(lists[i], lists[i + k]);
}
n = k;
}
return lists[0];
}
ListNode* merge2List(ListNode* n1, ListNode* n2) {
ListNode dummy(0);
ListNode* p = &dummy;
while(n1 && n2) {
if(n1->val < n2-> val) {
p->next = n1;
n1 = n1->next;
} else {
p->next = n2;
n2 = n2->next;
}
p = p->next;
}
if(n1) {
p->next = n1;
} else if(n2) {
p->next = n2;
}
return dummy.next;
}
};