Merge Sorted Array
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
Analysis:
While the lists is not empty, keep merging the list to the result list. Method to merge two lists is the same as Question 54
Code(updated 201309):
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *mergeKLists(vector<ListNode *> &lists) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
ListNode* head=new ListNode(0);
if (lists.size()==0){return NULL;}
head->next = lists[0];
ListNode *p;
ListNode *q;
for (int i=1;i<lists.size();i++){
p = head;
q = lists[i];
while (q){
if (!p->next){
p->next = q;
break;
}
if (p->next->val<q->val){
p=p->next;
}else{
ListNode *l = p->next;
p->next = q;
q=q->next;
p->next->next = l;
p=p->next;
}
}
}
return head->next;
}
};
Code(old version):
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* merg2(ListNode* l1, ListNode* l2){
ListNode* head = new ListNode(0);
head->next = l1;
ListNode* prev = head;
if (l1==NULL){
head->next=l2;
}
while (l1!=NULL && l2!=NULL){
if (l1->val < l2->val){
if (l1->next != NULL){
prev = l1;
l1=l1->next;
}else{
l1->next = l2;
break;
}
}else{
ListNode* tmp = l2->next;
prev->next = l2;
l2->next = l1;
prev = l2;
l2 = tmp;
}
}
return head->next;
}
ListNode *mergeKLists(vector<ListNode *> &lists) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if (lists.empty()){return NULL;}
ListNode *head = lists.back();
lists.pop_back();
while (!lists.empty()){
head = merg2(head,lists.back());
lists.pop_back();
}
return head;
}
if merge one by one, that'll be O(k^2 * n), assuming they n is the average length of the lists. try merge sort(for lists) of merge sort(for two lists), i.e. divide and conquer. running time reduced to O(logk*k*n).
ReplyDeleteHi Nison, I understand that the number of comparison is in the order of O(n * k ^ 2) if merging one by one. But the number of comparison of merging two lists at both ends at each time is in the order of O(k * n ), that is what I got from calculation. How did you get O(n * k * logk)?
DeleteMaybe use a priority queue to store all the nodes instead of arraylist?
DeleteExcuse for my little ads.
ReplyDeleteGood solution in O(n*n*m). Find out the O((n*m)*log(m)) here
http://fmarss.blogspot.com/2014/09/leetcode-solution_11.html
Get time limit exceeded with your code in OJ.
ReplyDelete