ListNode* mergeRecurse(vector<ListNode*>& lists, int start, int end) { if (start == end) { return lists[start]; } int mid = start + (end-start)/2; ListNode* l1 = mergeRecurse(lists, start, mid); ListNode* l2 = mergeRecurse(lists, mid+1, end); ListNode* res = mergeTwoLists(l1, l2); return res; }
void do_test(std::vector<int> data) { //makes a copy print_vector(data); std::vector<int> tmp(data.size()); mergeRecurse(&data[0], &tmp[0], 0, data.size(), std::less<int>()); print_vector(data); assert(std::is_sorted(data.begin(), data.end())); }
ListNode* mergeKLists(vector<ListNode*>& lists) { int n = lists.size(); if (n == 0) { return NULL; } if (n == 1) { return lists[0]; } return mergeRecurse(lists, 0, n-1); }
void mergeRecurse(Elem* arr, Elem* tmp, unsigned int l, unsigned int r, const Comp& lt) { unsigned int mid; unsigned int i; unsigned int j; unsigned int k; if (l < r) { mid = l + (r - l) / 2; mergeRecurse(arr,tmp,l,mid,lt); mergeRecurse(arr,tmp,mid,r,lt); for (i = l; i <= mid; i++) { tmp[i] = arr[i]; } for (j = r; j >= mid; j--) { tmp[j] = arr[j]; } for (i = l, j = r, k = l; k <= r; k++) { if (lt(tmp[j], tmp[i])) { arr[k] = tmp[j--]; } else { arr[k] = tmp[i++]; } } } }