lintcode 合併k個排序連結串列
阿新 • • 發佈:2019-02-03
合併k個排序連結串列,並且返回合併後的排序連結串列。嘗試分析和描述其複雜度。
給出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; } };