题目描述
给出一个整数数组A和有序的整数数组B,请将数组B合并到数组A中,变成一个有序的升序数组
注意:
1.可以假设A数组有足够的空间存放B数组的元素,A和 B中初始的元素数目分别为m和n,A的数组空间大小为m+n
2.不要返回合并的数组,返回是空的,将数组B的数据合并到A里面就好了
3.A数组在[0,m-1]的范围也是有序的

例1:
A: [1,2,3,0,0,0],m=3
B: [2,5,6],n=3
合并过后A为:
A: [1,2,2,3,5,6]

方法一:暴力求解

求解思路
最直接求解的方法,将A和B数组直接合并成C数组,然后对C数组直接排序即可!
图片说明

解题代码

class Solution
{
public:
    void merge(int A[], int m, int B[], int n) 
    {
        int clength=m+n;
        int C[clength];//构造一个新的数组
        for(int i=0;i<m;i++)
            C[i]=A[i];
        for(int i=m;i<m+n;i++)
            C[i]=B[i-m];
        //直接对C排序即可!(随便什么冒泡、选择、快排啥的,就当练练手)
        for(int i=0;i<m+n;i++)
            for(int j=i+1;j<m+n;j++)
            {
                if(C[i]>C[j])
                {
                    int temp;
                    temp=C[i];
                    C[i]=C[j];
                    C[j]=temp;
                }
            }
        for(int i=0;i<m+n;i++)
            A[i]=C[i];
    }
};

复杂度分析
时间复杂度:两个循环,O(图片说明 )
空间复杂度:开辟一个新的数组C,O(n+m),其中n和m分别为A和B数组的大小

方法二:双指针的思想

求解思路
使用双指针的思想,将A和B数组的指针顶到数组的最后一个位置,然后比较A,B数组的大小,然后从尾到头依次在A数组填入相应的数字,最后如果B数组有些数值比A数组的小,则将B数组直接遍历地填入A数组的头部位置即可。

图片说明

解题代码

class Solution//参考文卿周槐芳的code
{
public:
    void merge(int A[], int m, int B[], int n) 
    {

    int aPtr = m - 1, bPtr = n - 1;
//  两数组元素从右至左比较,大的去 A 尾部,直至有一方指针到头为止
    for (int ptr = m + n - 1; aPtr >= 0 && bPtr >= 0; ptr--)
    {
        A[ptr] = A[aPtr] > B[bPtr] ? A[aPtr--] : B[bPtr--];
    }
//  A 指针先走完的情况,B 中剩余元素直接copy至 A 对应位置即可;
    while (bPtr >= 0)
    {
        A[bPtr] = B[bPtr];
        bPtr--;
    }   
    }
};

复杂度分析
时间复杂度:一个循环,O(N)
空间复杂度:两个数组,没有引入其他的地址空间,O(1)