合并K个排序链表
代码:
class Solution {
public:
ListNode *mergeKLists(vector<ListNode *> &lists) {
if(lists.empty()) return nullptr;
vector<ListNode* > heap;
for(int i = 0; i != lists.size(); i ++){
if(lists[i]) heap.push_back(lists[i]);
}
makeHeap(heap);
ListNode head(-1);
ListNode* p = &head;
while(!heap.empty()){
auto minNode = heap[0];
p->next = minNode;
p = p->next;
auto next = minNode->next;
if(next) {
heap[0] = next;
}else{
swap(heap[0], heap[heap.size()-1]);
heap.pop_back();
}
minHeap(heap, 1);
}
return head.next;
}
void makeHeap(vector<ListNode*> &heap){
for(int i = heap.size()/2; i >0 ; i --){
minHeap(heap, i);
}
}
void minHeap(vector<ListNode*> &heap, int i){
int l = i*2;
int r = l+1;
int least(i);
if((l< heap.size()+1) && heap[l-1]->val<heap[i-1]->val ){
least = l;
}
if(r<heap.size()+1 && heap[r-1]->val<heap[least-1]->val){
least = r;
}
if(least != i){
swap(heap[i-1], heap[least-1]);
minHeap(heap, least);
}
}
};