Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
/*algorithm, merge two list one by one
1)for n list, merget 1,2 list ,get 1' list,
2)loop merge 1' list with n-1 list,
assume each list k lenth, then two list merge time is O(2k)
for n list, time O(nk) space O(1)
*/
ListNode* mergeList(ListNode* l1,ListNode* l2)
{
ListNode dummy(0),*tail = &dummy;
ListNode* node = NULL;
while(l1 && l2){
if(l1->val < l2->val){
node = l1;
l1 = l1->next;
node->next = NULL;
}else{
node = l2;
l2 = l2->next;
node->next = NULL;
}
tail->next = node;
tail = node;
}
while(l1){
node = l1;
l1=l1->next;
node->next = NULL;
tail->next = node;
tail = node;
}
while(l2){
node = l2;
l2 = l2->next;
node->next = NULL;
tail->next = node;
tail = node;
}
return dummy.next;
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.size() < 1)return NULL;
ListNode* ret = lists[0];
for(int i = 1;i < lists.size();i++){
ret = mergeList(ret,lists[i]);
}
return ret;
}
};
class Solution {
public:
/*algorithm, use min heap with k elements
time O(nlogk),space O(k)
*/
class myGreat{
public:
bool operator()(const ListNode* l1,const ListNode* l2){
return l1->val > l2->val;
}
};
ListNode* mergeKLists(vector<ListNode*>& lists) {
priority_queue<ListNode*,vector<ListNode*>,myGreat>Q;//use min heap with Great<int> as comparator
ListNode dummy(0),*tail=&dummy;
int k = lists.size();
//construct k min heap
for(int i = 0;i < k;i++){
if(lists[i])Q.push(lists[i]);
}
//sort and pop the min element to sorted list
while(!Q.empty()){
ListNode* cur = Q.top();Q.pop();
tail->next = cur;
tail = tail->next;
if(cur->next)Q.push(cur->next);
}
tail->next = NULL;
return dummy.next;
}
};