题目

给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。

示例1

  1. 输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
  2. 输出:[1,2,2,3,5,6]

示例 2:

  1. 输入:nums1 = [1], m = 1, nums2 = [], n = 0
  2. 输出:[1]

提示

  • nums1.length == m + n
  • nums2.length == n
  • 0 <= m, n <= 200
  • 1 <= m + n <= 200
  • -109 <= nums1[i], nums2[i] <= 109

    题解

    将两个有序数组合并成一个数组,且顺序还是有序的。
    思考一下有几种情况呢?
    第一种,nums1 的m为0,nums2 的n不为0
    第二种,nums1 的m不为0,nums2 的n为0
    第三种,nums1与nums2都不为空 最小值在nums1中 就像是示例1
    第四种, nums1与nums2都不为空 最小是在nums2中
    数组需要是个有序数组,那吗数组最后一位是nums1与nuns2中最大的值, 且nums1与nums2都是有序数组,
    那吗将两个指针分别指在最后一个元素,也就是m - 1 与 n - 1 ,那吗nums1数组最后一位怎吗办? 最后一位赋完值可是要换成倒数第二位的,那此时需要使用第三个指针,指到nums1的最后一位。
    那吗真吗解决上面四种情况呢?
    第一种情况可以放在最前面,当 m = 0 将nums2的数组赋值到nums1
    第二情况可以跟第三种合并,但是第三种还有一种情况就是nums2的元素数量很少,nums1还没遍历完而nums2就结束啦, 那吗遍历条件就是 m>=0 && n>= 0
    而第四种情况,说明nums2的长度大于nums1 或者nums2中有最小值,那吗就需要将nums2的剩余位遍历到nums1中

    实现代码

    ```javascript /**
    • @param {number[]} nums1
    • @param {number} m
    • @param {number[]} nums2
    • @param {number} n
    • @return {void} Do not return anything, modify nums1 in-place instead. [0] 0 [1] 1 */ var merge = function(nums1, m, nums2, n) { if(m == 0) { for(let i = 0; i < n; i++ ) {
      1. nums1[i] = nums2[i]
      } return nums1 } len = m + n; let prop = m— + n— -1; while( m>=0 && n >= 0) { if(nums1[m] > nums2[n]){ nums1[prop—] = nums1[m—]; } else { nums1[prop—] = nums2[n—]; } } while( n >= 0) { nums1[prop—] = nums2[n—] } return nums1

}; ```