Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
思路:自底向上递归实现,时间复杂度O(nlogk),空间复杂度O(k)
c++代码实现:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* merge2Lists(ListNode *list1,ListNode *list2){
ListNode *head = new ListNode(-1);
ListNode *cur = head;
while(list1 != NULL && list2 != NULL){
if(list1->val < list2->val){
cur->next = list1;
list1 = list1->next;
}
else{
cur->next = list2;
list2 = list2->next;
}
cur = cur->next;
}
if(list1 != NULL)
cur->next = list1;
else
cur->next = list2;
return head->next;
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.empty())
return NULL;
if(lists.size() == 1)
return lists.back();
vector<ListNode *> vec;
while(!lists.empty()){
if(lists.size() == 1){
vec.push_back(lists.back());
lists.pop_back();
}
else{
ListNode *p = lists.back();
lists.pop_back();
ListNode *q = lists.back();
lists.pop_back();
vec.push_back(merge2Lists(p,q));
}
}
return mergeKLists(vec);
}
};