1. 程式人生 > >lintcode 合併k個排序連結串列

lintcode 合併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;
        
    }
};