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:
typedef vector<ListNode*>::size_type sz;
// [b, e) be sure (e - b) >= 2;
ListNode* dividAndConquer(vector<ListNode*>& v, sz b, sz e) {
sz n = e - b;
sz mid = b + (e - b) / 2;
ListNode* left = NULL;
ListNode* right = NULL;
if (mid - b >= 2) left = dividAndConquer(v, b, mid);
else left = v[b];
if (e - mid >= 2) right = dividAndConquer(v, mid, e);
else right = v[mid];
ListNode dummy(INT_MIN);
ListNode* tail = &dummy;
if (left == NULL) return right;
if (right == NULL) return left;
while (left && right) {
if (left->val < right->val) {
tail->next = left;
left = left->next;
} else {
tail->next = right;
right = right->next;
}
tail = tail->next;
}
tail->next = left ? left : right;
return dummy.next;
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
sz size = lists.size();
if (size == 0) return NULL;
if (size == 1) return lists[0];
return dividAndConquer(lists, 0, size);
}
}; // runtime contribution 18.70%