题目
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。
示例1
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
示例 2:
输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[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++ ) {
} 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 nums1nums1[i] = nums2[i]
}; ```