[LintCode]Merge k Sorted Array
Version 1 比较笨的方法
public class Solution {
/**
* @param arrays k sorted integer arrays
* @return a sorted array
*/
public List<Integer> mergekSortedArrays(int[][] arrays) {
// 这是一个笨方法
if (arrays == null || arrays.length < 1) {
return new ArrayList<Integer>();
}
int[] tempArray = null;
for (int i = 0; i < arrays.length; i++) {
tempArray = mergeArrays(tempArray, arrays[i]);
}
List<Integer> rst = new ArrayList<Integer>();
for (int i = 0; i < tempArray.length; i++) {
rst.add(tempArray[i]);
}
return rst;
}
private int[] mergeArrays(int[] leftArray, int[] rightArray) {
if (leftArray == null || leftArray.length == 0) {
return rightArray;
}
if (rightArray == null || rightArray.length == 0) {
return leftArray;
}
int[] rstArray = new int[leftArray.length + rightArray.length];
int leftIndex = 0;
int rightIndex = 0;
for (int i = 0; i < rstArray.length; i++) {
if (leftIndex >= leftArray.length) {
rstArray[i] = rightArray[rightIndex];
rightIndex++;
continue;
}
if (rightIndex >= rightArray.length) {
rstArray[i] = leftArray[leftIndex];
leftIndex++;
continue;
}
if (leftArray[leftIndex] > rightArray[rightIndex]) {
rstArray[i] = rightArray[rightIndex];
rightIndex++;
} else {
rstArray[i] = leftArray[leftIndex];
leftIndex++;
}
}
return rstArray;
}
}
Version 2 更好一点的方法,速度更快
public class Solution {
/**
* @param arrays k sorted integer arrays
* @return a sorted array
*/
public List<Integer> mergekSortedArrays(int[][] arrays) {
// O(N log k).
// N is the total number of integers.
// k is the number of arrays.
if (arrays == null || arrays.length < 1) {
return new ArrayList<Integer>();
}
// 将组数分成奇数和偶数两种情况
int numOfArrays = arrays.length;
while (numOfArrays > 1) {
int timesOfMerge = numOfArrays / 2;
if (numOfArrays % 2 == 0) {
for (int i = 0; i < timesOfMerge; i++) {
arrays[i] = mergeArrays(arrays[i], arrays[i + timesOfMerge]);
}
numOfArrays = timesOfMerge;
} else {
for (int i = 0; i < timesOfMerge; i++) {
arrays[i] = mergeArrays(arrays[i], arrays[i + timesOfMerge + 1]);
}
numOfArrays = timesOfMerge + 1;
}
}
// 将数组装换成ArrayList
List<Integer> rst = new ArrayList<Integer>();
for (int i = 0; i < arrays[0].length; i++) {
rst.add(arrays[0][i]);
}
return rst;
}
/**
* 合并两个数组
*/
private int[] mergeArrays(int[] leftArray, int[] rightArray) {
if (leftArray == null || leftArray.length == 0) {
return rightArray;
}
if (rightArray == null || rightArray.length == 0) {
return leftArray;
}
int[] rstArray = new int[leftArray.length + rightArray.length];
int leftIndex = 0;
int rightIndex = 0;
for (int i = 0; i < rstArray.length; i++) {
if (leftIndex >= leftArray.length) {
rstArray[i] = rightArray[rightIndex];
rightIndex++;
continue;
}
if (rightIndex >= rightArray.length) {
rstArray[i] = leftArray[leftIndex];
leftIndex++;
continue;
}
if (leftArray[leftIndex] > rightArray[rightIndex]) {
rstArray[i] = rightArray[rightIndex];
rightIndex++;
} else {
rstArray[i] = leftArray[leftIndex];
leftIndex++;
}
}
return rstArray;
}
}