1. 题目描述

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

说明:

  • 初始化 nums1nums2 的元素数量分别为 m 和 n 。
  • 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。

示例:

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

2. 解题思路

首先看到这个题目,我们应该能想到使用双指针来解决这个问题。

  • 首先把两个指针分别指向两个数组生效部分的尾部
  • 每次两个指针所指向的值进行对比,将较大的值放在nums1的后面,并往前填补

这就是实现该题的步骤,但是我们还需要考虑一个问题,就是我们不确定是哪个数组先遍历完,这会对最后的几个产生影响,那就只有两种情况:

  • nums1先执行完,那就意味着nums1的头部空出来了,直接把nums2放在nums1前面即可
  • nums2先执行完,那本身就是再往nums1中填值所以就不用管了,得到的就是最终的结果

    3. 代码实现

    1. /**
    2. * @param {number[]} nums1
    3. * @param {number} m
    4. * @param {number[]} nums2
    5. * @param {number} n
    6. * @return {void} Do not return anything, modify nums1 in-place instead.
    7. */
    8. var merge = function(nums1, m, nums2, n) {
    9. //初始化指针:i指向nums1的结尾,j指向nums2的结尾,k指向合并后的最后一位
    10. let i =m-1, j = n-1, k = m+n-1;
    11. while(i>=0 && j>=0){
    12. if(nums1[i]>=nums2[j]){
    13. nums1[k] = nums1[i]
    14. i--
    15. k--
    16. }else{
    17. nums1[k]=nums2[j]
    18. j--
    19. k--
    20. }
    21. }
    22. // 处理nums1先执行完的情况
    23. while(j>=0){
    24. nums1[k] = nums2[j]
    25. j--
    26. k--
    27. }
    28. };

    4. 提交结果

    88. 合并两个有序数组 - 图1