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