1. 题目描述
给你两个有序整数数组 nums1
和 nums2
,请你将 nums2
合并到 nums1
中,使 nums1
成为一个有序数组。
说明:
- 初始化
nums1
和nums2
的元素数量分别为 m 和 n 。 - 你可以假设
nums1
有足够的空间(空间大小大于或等于 m + n)来保存nums2
中的元素。
示例:
输入:
nums1 = [1,2,3], m = 3
nums2 = [2,5,6], n = 3
输出: [1,2,2,3,5,6]
2. 解题思路
首先看到这个题目,我们应该能想到使用双指针来解决这个问题。
- 首先把两个指针分别指向两个数组生效部分的尾部
- 每次两个指针所指向的值进行对比,将较大的值放在nums1的后面,并往前填补
这就是实现该题的步骤,但是我们还需要考虑一个问题,就是我们不确定是哪个数组先遍历完,这会对最后的几个产生影响,那就只有两种情况:
- nums1先执行完,那就意味着nums1的头部空出来了,直接把nums2放在nums1前面即可
- nums2先执行完,那本身就是再往nums1中填值所以就不用管了,得到的就是最终的结果
3. 代码实现
/**
* @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) {
//初始化指针:i指向nums1的结尾,j指向nums2的结尾,k指向合并后的最后一位
let i =m-1, j = n-1, k = m+n-1;
while(i>=0 && j>=0){
if(nums1[i]>=nums2[j]){
nums1[k] = nums1[i]
i--
k--
}else{
nums1[k]=nums2[j]
j--
k--
}
}
// 处理nums1先执行完的情况
while(j>=0){
nums1[k] = nums2[j]
j--
k--
}
};
4. 提交结果