Javascript-合并两个有序数组

一、题目描述

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。

二、代码

1.直接拼接数组,然后排序
思路:使用spice()删除索引m后面的元素,并且插入nums里的元素。(注意使用扩展运算符’…',展开数组)
将获得的新数组排序
注意:splice(),sort()都是会修改原数组的。

/**
 * @param {number[]} nums1
 * @param {number} m
 * @param {number[]} nums2
 * @param {number} n
 * @return {void} Do not return anything, modify nums1 in-place instead.
 */
var merge = function(nums1, m, nums2, n) {
    nums1.splice(m,nums1.length-m,...nums2)
    nums1.sort((a,b)=>a-b)
}

2.双指针解法
思路:将两个数组看成队列,定义两个指针分别指向队列的头部,每次都分别从两个队列里取出一个数比较,获取较小的数,且其指针向后移动,而另一个指针不动,继续下一轮的比较,直到两个指针都指向队列的末尾,完成。

/**
 * @param {number[]} nums1
 * @param {number} m
 * @param {number[]} nums2
 * @param {number} n
 * @return {void} Do not return anything, modify nums1 in-place instead.
 */
var merge = function(nums1, m, nums2, n) {
    let p1 = 0,p2 = 0
    var tem;
    const sorted = new Array(m+n).fill(0)
    while(p1 < m || p2 < n){
        // 说明p1已经全部填入
        if(p1 == m){
            tem = nums2[p2++]
        }else if(p2 == n){
            tem = nums1[p1++]
        }else if(nums1[p1]<=nums2[p2]){
            tem = nums1[p1++]  //p1++ 先p1 在+1
        }else{
            tem = nums2[p2++]
        }
        sorted[p1+p2-1] = tem
    }
    for(let i = 0;i<m+n;i++){
        nums1[i] = sorted[i]
    }
};
  • 举个栗子:
  • [1,2,3] p1:0 ->1 (p1值当前为0,指向第0个元素个为1)
  • [2,4,5] p2:0 ->2
  • sort = [],m,n分别是数组的长度

注释:

第一次比较p1(0) ->1 小于 p2(0)->2取小的1 放入sort = [1]p1++,p2不变

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

  • 注意
    判断p1 == m 和 p2 == n 应该放到最前面,因为当p1 == m 或 p2 == n 时,已经获取不到值,无法正确比较大小,因此需要提前判断!
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值