https://leetcode.com/problems/merge-k-sorted-lists/
类似归并排序,每次分两半递归,然后用 前一题 的代码合并起来。复杂度 T(n) = 2T(n/2) + O(kn)。
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode[]} lists
* @return {ListNode}
*/
var mergeTwoLists = function(l1, l2) {
var head = new ListNode(0), ptr = head;
while (l1 !== null || l2 !== null){
if (l1 !== null && (l2 === null || l1.val < l2.val)){
ptr.next = new ListNode(l1.val);
l1 = l1.next;
}
else{
ptr.next = new ListNode(l2.val);
l2 = l2.next;
}
ptr = ptr.next;
}
return head.next;
};
var mergeKLists = function(lists) {
var k = lists.length;
if (k == 0) return null;
if (k == 1) return lists[0];
var m = k / 2;
var l = mergeKLists(lists.slice(0, m));
var r = mergeKLists(lists.slice(m));
return mergeTwoLists(l, r);
};
复杂度一样。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
#define REP(i, n) for (int i=0;i<n;++i)
typedef pair<int, int> PII;
priority_queue<PII, vector<PII>, greater<PII>> Q;
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
int k = lists.size(); REP(i, k) if (lists[i] != nullptr) Q.push(make_pair(lists[i]->val, i));
ListNode* head = new ListNode(0), *ptr = head;
while (!Q.empty()){
ptr->next = new ListNode(Q.top().first); ptr = ptr->next;
int i = Q.top().second; lists[i] = lists[i]->next;
if (lists[i] != nullptr) Q.push(make_pair(lists[i]->val, i));
Q.pop();
}
return head->next;
}
};




Alca
Amber
Belleve Invis
Chensiting123
Edward_mj
Fotile96
Hlworld
Kuangbin
Liyaos
Lwins
LYPenny
Mato 完整版
Mikeni2006
Mzry
Nagatsuki
Neko13
Oneplus
Rukata
Seter
Sevenkplus
Sevenzero
Shirleycrow
Vfleaking
wangzhpp
Watashi
WJMZBMR
Wywcgs
XadillaX
Yangzhe
三途川玉子
About.me
Vijos
