88. 合并两个有序数组 题目难度(简单)

原题目链接:https://leetcode-cn.com/problems/merge-sorted-array/

做题思路一

  1. 准备好三个指针p1,p2,p3,指针意思就是指向下标的针线,设置指针的目的是为了方便定位,当前数组比较到了哪个元素。

图里面里面的0,1,2,3是指下标

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

  1. 先把nums1拷贝一份,然后比较nums1_copy[p1]和nums2[p2]的大小
    2.1 如果nums1_copy[p1] < nums[p2] ,就把nums1_copy[p1]的元素放入nums1[p3]的位置,然后p1++,p3++
    2.2 如果nums1_copy[p1] >= nums[p2] ,就把nums2[p2]的元素放入nums1[p3]的位置,然后p2++,p3++

  2. 题目给出的nums1元素个数和nums2元素个数不一定相同,也就是说m不一定会等于n,所以就会导致可能某一个多元素数组只比较了一部分,剩下的都没有比较,由于nums1数组和nums2数组都是有序数组,所以可以直接把剩下的没比较的元素,直接移动到数组后面

废话不多说,直接上代码,我的代码里加了大量的注释,相信各位看官可以理解,如果我有些没写清楚或者写错的,可以评论区或者私信我喔

		//把nums1数组复制一份,这样就把nums1数组当成空数组放排好序的数据
        int[] nums1_copy = new int[m];
        //开始拷贝
        System.arraycopy(nums1,0,nums1_copy,0,m);
        //准备三个指针
        int p1 = 0; //nums1_copy数组用的
        int p2 = 0; //nums2数组用的
        int p3 = 0; //nums1数组用的

        //开始判断大小
        while(p1 < m && p2 < n){
            //小的先放
            nums1[p3++] = (nums1_copy[p1] < nums2[p2]) ? nums1_copy[p1++] : nums2[p2++];
        }

        //如果只有一个数组比较完,也就是说还有另一个数组没有比较完,就直接添加
        //解释一下m + n - p1 - p2的意思,m + n就是nums1的长度
        //p1指针所指位置往左都是已经比较完的数据,同理p2也是
        //所以m + n - p1 - p2得出的结果就是还没比较数据元素个数
        if(p1 < m){
            System.arraycopy(nums1_copy,p1,nums1,p1 + p2,m + n - p1 - p2);
        }
        if(p2 < n){
            System.arraycopy(nums2,p2,nums1,p1 + p2,m + n - p1 - p2);
        }

做题思路二

  1. 准备三个指针,p1指向nums1的尾部元素,p2指向nums2的尾部元素,p3指向最终合并后数组的尾部元素

这里图把nums1当成最终合并后的数组,题目给出的nums1有足够的空间存储m+n个元素,所以是可以的

在这里插入图片描述
在这里插入图片描述

  1. 当p1 >= 0的时候,nums1[p1]和nums2[p2]进行比较
    2.1 当nums1[p1] >= nums2[p2]的时候,将nums1[p1]上的元素放入nums1[p3],然后p1- -,p3- -
    2.2 当nums1[p1] < nums2[p2]的时候,将nums2[p2]上的元素放入nums1[p3],然后p2- -,p3- -
  2. 当p1 < 0的时候,由于两个数组本身就是有序数组,所以可以直接把没比较的元素直接放入后面,nums1[p3] = nums2[p2],然后p3- -,p2 - -
  3. 循环结束条件是p2 < 0

废话不多说,直接上代码

 	   int p1 = m - 1; int p2 = n - 1; int p3 = m + n -1;
       while(p2 >= 0){
           if(p1 >= 0 && nums1[p1] > nums2[p2]){
               nums1[p3--] = nums1[p1--];
           }else{
               nums1[p3--] = nums2[p2--];
           }
       }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值