二刷

不用考虑合并到最后A是否会被覆盖
不会
因为从后面开始弄 永远不会覆盖到A 被覆盖的都是已经排好序的 没用的

public class Solution {
    public void merge(int A[], int m, int B[], int n) {
        int i=m-1;
        int j=n-1;
        while(i>=0 && j>=0){
            if(A[i] > B[j]){
                A[i+j+1] = A[i];
                i--;
            }
            else{
                A[i+j+1] = B[j];
                j--;
            }
        }
        while(j>=0) A[i+j+1] = B[j--]; 


    }
}

1.创造了一个新数组。

public class Solution {
    public void merge(int A[], int m, int B[], int n) {
        int [] merge = new int[m+n];
        int i=0,j=0,k=0;
        while(i<m && j<n){ // 注意这里要是&& 我之前是 || 会出问题
            if(A[i]<B[j]){
                merge[k] = A[i];
                i++;
            }
            else{
                merge[k] = B[j];
                j++;
            }
            k++;
        }
        if(j==n){
            for(;i<m;k++,i++){
                merge[k] = A[i];
            }
        }
        if(i==m){
            for(;j<n;k++,j++){
                merge[k] = B[j];
            }
        }
        for(int count=0; count< m+n; count++ ){
            A[count] = merge[count];
        }
    }
}

2.因为给的题目已经扩充了 A 数组 因此 可以从 A数组屁股 从大到小进行排序, 这样节省空间。