合并k个排序链表,并且返回合并后的排序链表。尝试分析和描述其复杂度。
样例
给出3个排序链表[2->4->null,null,-1->null],返回 -1->2->4->null
/**
* Definition of ListNode
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
vector<ListNode*> heap;
inline bool cmp(const ListNode *a,const ListNode *b){
return a->val<b->val;
}
void push(ListNode *elem){
heap.push_back(elem);
for(int i=heap.size()-1;i>1&&cmp(heap[i],heap[i/2]);i/=2)
swap(heap[i],heap[i/2]);
}
ListNode* pop(){
int size=heap.size();
ListNode *ret=heap[1];
heap[1]=heap[size-1];
heap.pop_back();
for(int c,i=1;(c=2*i)<size-1;i=c){
if(c+1<size-1&&cmp(heap[c+1],heap[c]))
++c;
if(cmp(heap[i],heap[c]))
break;
swap(heap[i],heap[c]);
}
return ret;
}
public:
Solution(){ //构造函数
heap.push_back(nullptr); //访问从heap[1]开始
}
ListNode *mergeKLists(vector<ListNode*> &lists) {
if(lists.empty())
return nullptr;
for(auto &e:lists)
if(e!=nullptr)
push(e);
ListNode *head=nullptr;
ListNode *tail=nullptr;
while(heap.size()>1){ //heap[0]==nullptr,填充位置
ListNode *newnode=pop();
if(newnode->next)
push(newnode->next);
if(!head)
head=newnode;
else
tail->next=newnode;
tail=newnode;
}
return head;
}
};