private int[] mergeHelper_v2_Divide_Conquer(int[][] arrays, int start, int end) {
if (start == end) {
return arrays[start];
}
int mid = start + (end - start) / 2;
int[] left = mergeHelper_v2_Divide_Conquer(arrays, start, mid);
int[] right = mergeHelper_v2_Divide_Conquer(arrays, mid + 1, end);
return mergeTwoSortedArrays(left, right);
}
private int[] mergeTwoSortedArrays(int[] arr1, int[] arr2) {
if (arr1 == null) {
return arr2;
}
if (arr2 == null) {
return arr1;
}
int n = arr1.length + arr2.length;
int[] merge = new int[n];
int idx = 0;
int i = 0, j = 0;
while (i < arr1.length && j < arr2.length) {
if (arr1[i] <= arr2[j]) {
merge[idx++] = arr1[i++];
} else {
merge[idx++] = arr2[j++];
}
}
while (i < arr1.length) {
merge[idx++] = arr1[i++];
}
while (j < arr2.length) {
merge[idx++] = arr2[j++];
}
return merge;
}