数组-合并两个有序数组

386 阅读1分钟

描述

给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。

输入:nums1 = [1,2,3],nums2 = [2,5,6]

输出:[1,2,2,3,5,6]

解题思路一

1.新建一个 m + n 长度的数组res 2. 准备两个指针 i 和 j,一开始分别指向m-1 和 n-1 3.nums1[i]和nums2[j], 将大的值从res的尾部往前插入 4.判断nums2是否还有剩余的元素,对其插入

function merge(nums1, nums2){
    let i = nums1.length -1
    let j = nums2.length -1
    
    let res = new Array(nums1.length + nums2.length)
    
    while(i>= 0 && j>=0) {
        if (nums1[i] <= nums2[j]) { 
            res.unshift(nums2[j--])

        } else {
            res.unshift(nums1[i--])
        }
    }
    
    if(i >= 0) {
        res.unshift(...nums1.slice(0, i + 1))
    }
    
    if(j >= 0) {
        res.unshift(...nums2.slice(0, j + 1))
    }
    
    return res
}

解题思路二

思路一额外增加了空间复杂度不说,还不满足题目要求,题目要是是改变nums1数组得到最后的结果

正确方式:

1.双指针i和j,分别指向m-1 和 n-1 2.从nums1[m + n -1]开始存放nums1[i]和nums2[j]中的最大值 3.指针递减

function merge2(nums1, nums2){
    let i = nums1.length -1
    let j = nums2.length -1
    let k = nums1.length + nums2.length -1
    while(i >=0 && j >= 0) {
        if(nums1[i] <= nums2[j]) {
            nums1[k--] = nums2[j--]
        } else {
            nums1[k--] = nums1[i--]
        }
    }
    while(j >=0) {
        nums1[k--] = nums2[j--]
    }
}