从后往前看,在每一个位置上选择A和B中较小的那一个
c++

class Solution {
public:
    void merge(int A[], int m, int B[], int n) {
        int a = m-1;
        int b = n-1;
        for(int i = m+n-1 ; i >= 0 ; i--)//需要填m+n次
        {
            if(b<0||(a>=0&&A[a]>=B[b]))
            //B数组中的数全部用完了就填A数组中的数 a数组中的数没有用完,并且A数组的数大
            {
                A[i]=A[a];
                a--;
            }
            else
            {
                A[i]=B[b];
                b--;
            }
        }
    }
};

java

public class Solution {
    public void merge(int A[], int m, int B[], int n) {
        int a = m-1;
        int b = n-1;
        for(int i = m+n-1 ; i >= 0 ; i--)//需要填m+n次
        {
            if(b<0||(a>=0&&A[a]>=B[b]))
            //B数组中的数全部用完了就填A数组中的数 a数组中的数没有用完,并且A数组的数大
            {
                A[i]=A[a];
                a--;
            }
            else
            {
                A[i]=B[b];
                b--;
            }
        }
    }
}

python

class Solution:
    def merge(self , A, m, B, n):
        a = m-1;
        b = n-1;
        for i in range(m+n-1,-1,-1):
            if b<0 or a>=0 and A[a]>=B[b]:
            #B数组中的数全部用完了就填A数组中的数 a数组中的数没有用完,并且A数组的数大
                A[i]=A[a]
                a=a-1
            else:
                A[i]=B[b]
                b=b-1