Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.size()==0) return NULL;
while(lists.size()>1){
lists.push_back(mergeTwoLists(lists[0],lists[1]));
lists.erase(lists.begin());
lists.erase(lists.begin());
}
return lists[0];
}
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode *temp=new ListNode(-1),*p=l1,*q=l2,*pre;
pre=temp;
while(p&&q){
if(p->val>q->val) {temp->next=q;q=q->next;}
else{temp->next=p;p=p->next;}
temp=temp->next;
}
if(p) temp->next=p;
if(q) temp->next=q;
return pre->next;
}
};
然后看到leetcode讨论区有一个对mergeklists函数的改进
ListNode *mergeKLists(vector<ListNode *> &lists) {
if (lists.empty()) return NULL;
int len = lists.size();
while (len > 1) {
for (int i = 0; i < len / 2; ++i) {
lists[i] = mergeTwoLists(lists[i], lists[len - 1 - i]);
}
len = (len + 1) / 2;
}
return lists.front();
}