合并k个排序链表
合并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;
}
};