/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
ListNode *merge(ListNode *left, ListNode *right) {
if(!left)
return right;
if(!right)
return left;
ListNode *head = (left->val < right->val) ? left : right;
while(left && right)
if(left->val < right->val) {
ListNode *next = left->next;
if(!left->next || left->next->val >= right->val)
left->next = right;
left = next;
} else {
ListNode *next = right->next;
if(!right->next || right->next->val > left->val)
right->next = left;
right = next;
}
return head;
}
ListNode *DivideAndConquerMerge(vector<ListNode *> &A, int low, int high) {
if(low >= high)
return A[low];
int mid = low + ((high - low) >> 1);
ListNode *left = DivideAndConquerMerge(A, low, mid);
ListNode *right = DivideAndConquerMerge(A, mid + 1, high);
return merge(left, right);
}
ListNode* Solution::mergeKLists(vector<ListNode*> &A) {
return DivideAndConquerMerge(A, 0, A.size() - 1);
}