方法一:正着合并

public class Solution {

    public void merge(int A[], int m, int B[], int n) {
        int[] ACopy = new int[m];
        for (int i = 0; i < m; i++) {
            ACopy[i] = A[i];
        }
        // 合并两个有序数组
        int len = m + n;
        int i = 0;
        int j = 0;
        for (int k = 0; k < len; k++) {
            if (i == m) {
                A[k] = B[j];
                j++;
            } else if (j == n) {
                A[k] = ACopy[i];
                i++;
            } else if (ACopy[i] <= B[j]) {
                A[k] = ACopy[i];
                i++;
            } else {
                A[k] = B[j];
                j++;
            }
        }
    }
}

方法二:倒着合并

public class Solution {

    public void merge(int A[], int m, int B[], int n) {
        // 合并两个有序数组
        int len = m + n;
        int i = m - 1;
        int j = n - 1;
        for (int k = len - 1; k >= 0; k--) {
            if (i == -1) {
                // 只能归并 j
                A[k] = B[j];
                j--;
            } else if (j == -1) {
                break;
            } else if (A[i] <= B[j]) {
                A[k] = B[j];
                j--;
            } else {
                A[k] = A[i];
                i--;
            }
        }
    }
}