合并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  阅读(315)  评论(0编辑  收藏  举报

导航