Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
解法一:依次合并两个,直至把所有的合并完。
ListNode* mergeKLists(vector<ListNode*>& lists) {
int n=lists.size();
if(n==0) return NULL;
while(lists.size()>=2)
{
lists.push_back(merge2lists(lists[0],lists[1]));
lists.erase(lists.begin());
lists.erase(lists.begin());
}
return lists[0];
}
ListNode* merge2lists(ListNode* a,ListNode* b)//合并2个
{
if(a==NULL) return b;
if(b==NULL) return a;
ListNode* l=new ListNode(0),*p;
p=l;
while(a&&b)
{
if(a->val<b->val)
{
l->next=a;
a=a->next;
}
else
{
l->next=b;
b=b->next;
}
l=l->next;
}
if(a)
l->next=a;
if(b)
l->next=b;
return p->next;
}
解法二:
运用优先队列,每次找到的都是当前所有节点中的最小节点。
struct com{
bool operator()( ListNode* &t1, ListNode* &t2)
//优先队列比较函数的重载
{
return t1->val > t2->val;
}
};
ListNode* mergeKLists(vector<ListNode*>& lists) {
priority_queue<ListNode*,vector<ListNode*>,com> pq;
int n=lists.size();
for(int i=0;i<n;i++)
if(lists[i]) pq.push(lists[i]);
ListNode* l=new ListNode(0),*p=l;
while(pq.size()>0)
{
l->next=pq.top();
pq.pop();
l=l->next;
if(l->next)
pq.push(l->next);
}
return p->next;
}