利用堆排序,维护一个最小堆,取每个链表最前的节点组成堆,每次取出堆顶
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
ListNode *result = nullptr, *p = nullptr;
auto cmp = [](ListNode *x, ListNode *y){ return x->val > y->val;};
priority_queue<ListNode *, vector<ListNode *>, decltype(cmp)> heap(cmp);
int N = lists.size();
vector<ListNode *> lp(N, nullptr);
for(int i = 0; i < N; i++){
lp[i] = lists[i];
if(lp[i] != nullptr)
heap.push(lp[i]);
}
while(!heap.empty()){
if(result == nullptr){
p = result = heap.top();
} else {
p->next = heap.top();
p = p->next;
}
heap.pop();
if(p->next!=nullptr)
heap.push(p->next);
}
return result;
}
};