Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
Difficulty: Hard
Divide and conquer, not a hard question.
nlogk
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeTwo(ListNode *l1, ListNode *l2){
ListNode* start = new ListNode(0);
ListNode* current = start;
while(l1!=NULL&&l2!=NULL){
if(l1->val<l2->val){
current->next = l1;
current = current->next;
l1 = l1->next;
current->next = NULL;
}
else{
current->next = l2;
current = current->next;
l2 = l2->next;
current->next = NULL;
}
}
if(l1==NULL){
current->next = l2;
}
else if(l2==NULL){
current->next = l1;
}
return start->next;
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
vector<ListNode*> listsNoNull;
int len = lists.size();
for(int i = 0;i<len;i++)
if(lists[i]!=NULL)
listsNoNull.push_back(lists[i]);
len = listsNoNull.size();
if(len==0)
return NULL;
int currentLen = len;
while(currentLen!=1){
for(int i = 0; i<=currentLen/2-1;i++){
listsNoNull[i] = mergeTwo(listsNoNull[i], listsNoNull[currentLen-i-1]);
}
currentLen = currentLen/2 + currentLen%2;
}
return listsNoNull[0];
}
};