ListNode* divide_conquer(vector<ListNode*>& lists, int i, int j) { // base case: only one or two lists left if (i == j) return lists[i]; if (i + 1 == j) return merge2Lists(lists[i], lists[j]); // Recursive: partion into two parts, [i, mid] and [mid+1, j] // sort each part with divide_conquer(), and then merge them int mid = i + (j - i) / 2; return merge2Lists(divide_conquer(lists, i, mid), divide_conquer(lists, mid + 1, j)); }
struct PointArray* closest_pair(char *filename){ struct Connection *conn = File_open(filename, "rt"); struct PointArray *point_array = Connection_process(conn); Connection_close(conn); struct PointArraySplitted *split_array = split_point_array(point_array); struct OrderedPointArray *ordered1 = malloc(sizeof(struct OrderedPointArray)); ordered1->x_ordered = split_array->array1; ordered1->y_ordered = split_array->array1; struct OrderedPointArray *ordered2 = malloc(sizeof(struct OrderedPointArray)); ordered2->x_ordered = split_array->array2; ordered2->y_ordered = split_array->array2; struct PointArray *result; struct OrderedPointArray *result1 = split_sort(ordered1); struct OrderedPointArray *result2 = split_sort(ordered2); struct OrderedPointArray *result_merged = merge_point_array(result1, result2); divide_conquer(result_merged->x_ordered, result_merged->y_ordered); return result; }
ListNode* mergeKLists(vector<ListNode*>& lists) { if (lists.empty()) return NULL; return divide_conquer(lists, 0, lists.size() - 1); }