lintcode 合併k個排序鏈表

合併k個排序鏈表 

合併k個排序鏈表,並且返回合併後的排序鏈表。嘗試分析和描述其複雜度。

您在真實的面試中是否遇到過這個題?  Yes
樣例

給出3個排序鏈表[2->4->null,null,-1->null],返回 -1->2->4->null

標籤 
推特 
領英 
鏈表 
愛彼迎 
臉書 
優先隊列 
分治法 

優步 
谷歌

相關題目 

分析:這道題是多個個鏈表合併,增大了難度。不過也可以繼續用兩兩合併做,看到別人的一種方法使用分治。我這裏用的是最小堆,把每個鏈表的頭結點插入最小堆,然後取出最小的結點,把最小節點的next在壓入,如此循環(爲什麼不全部壓進去在一次性取呢,因爲那樣可能會比較浪費時間,也很麻煩)。

其中結點入隊出隊有點麻煩。

/**
 * Definition of ListNode
 * class ListNode {
 * public:
 *     int val;
 *     ListNode *next;
 *     ListNode(int val) {
 *         this->val = val;
 *         this->next = NULL;
 *     }
 * }
 */
 struct cmp{
     bool operator()(ListNode *a,ListNode *b){//最小堆這裏是大於號。。。
         return a->val>b->val;
     }
 };
class Solution {
public:
    /**
     * @param lists: a list of ListNode
     * @return: The head of one sorted list.
     */
    ListNode *mergeKLists(vector<ListNode *> &lists) {
        // write your code here
        priority_queue<ListNode *,vector<ListNode*>,cmp> p;
        for(int i=0;i<lists.size();i++){
            if(lists[i])
            p.push(lists[i]);
        }
        ListNode *head=NULL,*pre=NULL,*tmp=NULL;
        if(p.empty())
        return NULL;
        while(!p.empty()){
            tmp=p.top();
            p.pop();
            if(!head)//判斷head是否爲空
            {
                head=tmp;
                pre=head;
            }
            else{
            pre->next=tmp;
            pre=pre->next;
            }
            if(tmp->next){
                p.push(tmp->next);
            }
            
        }
        pre->next=NULL;
        return head;
        
    }
};
点赞