利用归并排序,合并时从后向前合并,可以避免元素的移动。

class Solution {
public:
    void merge(int A[], int m, int B[], int n) {
        int i = m -1, j = n - 1, end = m + n - 1;
        while(end >= 0) {
            // 当A数组已经合并完,或者B的最后一个元素大于A的最后一个元素时,就应该合并B的元素了
            if(i < 0 || (j >=0 && A[i] < B[j]))
                A[end--] = B[j--];
            else
                A[end--] = A[i--];
        }
    }
};