K路归并问题小结
声明
文章均为本人技术笔记,转载请注明出处:
[1] https://segmentfault.com/u/yzwall
[2] blog.csdn.net/j_dark/
1 二路归并
1.1 归并排序-数组
归并排序思想:归并排序可用分治法实现,先保证局部有序,然后二路归并局部有序部分为整体有序;
/**
* http://www.lintcode.com/en/problem/sort-integers-ii/
* 归并排序一个整型数组(升序)
* @author yzwall
*/
class Solution {
public void sortIntegers2(int[] A) {
if (A == null || A.length == 0) {
return;
}
mergeSort(A, 0, A.length - 1);
}
// 分治递归空间O(logn),逐层合并时间复杂度O(n)
private void mergeSort(int[] A, int start, int end) {
if (start >= end) {
return;
}
int mid = start + (end - start) / 2;
mergeSort(A, start, mid);
mergeSort(A, mid + 1, end);
mergeTwoArrays(A, start, end);
}
// 二路归并时间复杂度O(n),空间复杂度O(n)
private void mergeTwoArrays(int[] A, int start, int end) {
int mid = start + (end - start) / 2;
int i = start, j = mid + 1;
int index = 0;
int[] temp = new int[end - start + 1];
while (i <= mid && j <= end) {
if (A[i] < A[j]) {
temp[index++] = A[i++];
} else {
temp[index++] = A[j++];
}
}
while (i <= mid) {
temp[index++] = A[i++];
}
while (j <= end) {
temp[index++] = A[j++];
}
for (int k = 0; k < index; k++) {
A[start + k] = temp[k];
}
}
}
1.2 合并两个排序数组
class Solution {
public int[] mergeSortedArray(int[] A, int[] B) {
if (A == null || B == null) {
return new int[0];
}
ArrayList<Integer> list = new ArrayList<>();
int i = 0, j = 0;
while (i < A.length && j < B.length) {
if (A[i] <= B[j]) {
list.add(A[i]);
i++;
} else {
list.add(B[j]);
j++;
}
}
while (i < A.length) {
list.add(A[i++]);
}
while (j < B.length) {
list.add(B[j++]);
}
int[] results = new int[list.size()];
for (i = 0; i < list.size(); i++) {
results[i] = list.get(i);
}
return results;
}
}
1.2 合并两个排序数组
/**
* 合并两个有序数组,双指针法二路归并算法,最后覆盖A数组
* http://www.lintcode.com/zh-cn/problem/merge-sorted-array/
* @author yzwall
*/
class Solution {
public void mergeSortedArray(int[] A, int m, int[] B, int n) {
int i = 0, j = 0;
ArrayList<Integer> list = new ArrayList<>();
while (i < m && j < n) {
if (A[i] <= B[j]) {
list.add(A[i]);
i++;
} else {
list.add(B[j]);
j++;
}
}
while (i < m) {
list.add(A[i++]);
}
while (j < n) {
list.add(B[j++]);
}
for (int k = 0; k < list.size(); k++) {
A[k] = list.get(k);
}
}
}
1.3 合并两个排序链表
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null && l2 == null) {