两个有序数组合并

题目描述

给出两个有序的整数数组A和B,请将数组B合并到数组A中,变成一个有序的数组
注意:
可以假设A数组有足够的空间存放B数组的元素,A和B中初始的元素数目分别为m和n

题目分析

1.这里面我们需要用到双指针遍历,两个指针分别从A和B的尾部遍历
2.最开始比较A和B的m,n这个尾部的值,把较大的值赋值给A整体整数数组的尾部,然后指针左移
3.其中到最后,可能有一个先结束,假如B先遍历完,这个时候我们不用管;假如B后遍历完,这个时候我们需要把B数组移到A的最前面

可以参考这个动画:https://uploadfiles.nowcoder.com/images/20201222/9980465_1608625675726/CC10229F9946F5EAF1B6DF9B6A442854

代码如下

public void merge(int A[], int m, int B[], int n) {
        
        int curA = m - 1; //定义一个指针在A末尾
        int curB = n - 1;  //定义一个指针在B末尾
        int index = m + n - 1;  //定义一个在合并后的A数组的末尾
        
        //遍历的条件,二者指针必须都在上面
        while(curA>=0&&curB>=0){
            //必须满足A此时的值,大于B,我们才把A的值移动到末尾
            if(A[curA]>B[curB]){
                A[index--] = A[curA--];
            //A的值要是小于等于B,我们就把B的值移动到末尾
            }else{
                A[index--] = B[curB--];
            }
        }
        
        //此时B没有遍历完,我们把它剩余的移动到合并的下面   
        //这里不用再写A为遍历完的情况,多此一举,本来就是合并到A中
        while(curB >= 0){
            A[index--] = B[curB--];
        }
    }
posted @ 2021-04-15 19:39  Diamond-fz  阅读(111)  评论(0编辑  收藏  举报