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;
 }
Exemple #2
0
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);
     
 }
Exemple #4
0
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++];
            }
        }
    }
}