088.合并两个有序数组

题目

给你两个有序整数数组 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
  • -10^9 <= nums1[i], nums2[i] <= 10^9

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/merge-sorted-array 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

JS实现

/**
 * @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) {
  const sorted = new Array(m + n).fill(0);

  let p1 = 0,
    p2 = 0,
    curr;
  while (p1 < m || p2 < n) {
    if (p1 === m) {
      curr = nums2[p2++];
    } else if (p2 === n) {
      curr = nums1[p1++];
    } else if (nums1[p1] < nums2[p2]) {
      curr = nums1[p1++];
    } else {
      curr = nums2[p2++];
    }
    sorted[p1 + p2 - 1] = curr;
  }
  for (let i = 0; i < m + n; i++) {
    nums1[i] = sorted[i];
  }
};

Go实现

package main

import (
  "fmt"
)

func main() {
  nums1 := []int{1, 2, 3, 0, 0, 0}
  m := 3
  nums2 := []int{0, 1, 2}
  n := 3

  mergeArr(nums1, m, nums2, n)
  fmt.Println(nums1)

  nums1 = []int{1, 2, 3, 0, 0, 0}
  nums2 = []int{2, 5, 6}
  mergeArr2(nums1, m, nums2, n)
  fmt.Println(nums1)
}

/*
nums1 := []int{1, 2, 3, 0, 0, 0}
m := 3
nums2 := []int{0, 1, 2}
n := 3
*/
func mergeArr(nums1 []int, m int, nums2 []int, n int) {
  p := m - 1
  q := n - 1
  k := len(nums1) - 1
  for p >= 0 && q >= 0 {
    if nums1[p] > nums2[q] {
      nums1[k] = nums1[p]
      p -= 1
    } else {
      nums1[k] = nums2[q]
      q -= 1
    }
    k -= 1
  }

  for q >= 0 {
    nums1[k] = nums2[q]
    q -= 1
    k -= 1
  }
}

func mergeArr2(nums1 []int, m int, nums2 []int, n int) {
  for p := m + n; m > 0 && n > 0; p-- {
    if nums1[m-1] <= nums2[n-1] {
      nums1[p-1] = nums2[n-1]
      n--
    } else {
      nums1[p-1] = nums1[m-1]
      m--
    }
  }
  for ; n > 0; n-- {
    nums1[n-1] = nums2[n-1]
  }
}