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:
ListNode *mergeKLists(vector<ListNode *> &lists) {
int len = lists.size();
if(len == 0) return NULL;
ListNode *head = mergeSort(lists, 0, len - 1);
return head;
}
ListNode *mergeSort(vector<ListNode *> &lists, int left, int right) {
if(left < right) {
int mid = (left + right) / 2;
ListNode *front = mergeSort(lists, left, mid);
ListNode *back = mergeSort(lists, mid + 1, right);
return merge(front, back);
}
return lists[left];
}
ListNode *merge(ListNode *list1, ListNode *list2) {
if(!list1 && !list2) return NULL;
ListNode dummy(0);
ListNode *tail = &dummy;
while(list1 && list2) {
if(list1->val < list2->val) {
tail->next = list1;
list1 = list1->next;
} else {
tail->next = list2;
list2 = list2->next;
}
tail = tail->next;
}
if(list1) {
tail->next = list1;
}
if(list2) {
tail->next = list2;
}
return dummy.next;
}
};