合并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);
}
}
};

posted on 2017-08-17 23:08  p666  阅读(337)  评论(0)    收藏  举报

导航