# 88 Merge Sorted Array (有圖)

熟記 while,因為有時比 for 好用 / 多想一點 Edge Case

LeetCode

Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.

Note:

The number of elements initialized in nums1 and nums2 are m and n respectively.
You may assume that nums1 has enough space 
(size that is greater or equal to m + n) to hold additional elements from nums2.

input: 給兩個已經排序好的 Array 
output: 合併成一個排好的大 Array,而且不能用額外空間
Example:

Input:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6],       n = 3

Output: [1,2,2,3,5,6]

/**
 * @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) {}

Edge Case

  • 只有一個值的情況例如 [0] 0, [1], 1 or [1], 1, [0], 0

怎麼解

  • 給定 m、n 代表一開始就會知道 nums1.length = m+ n = pointer

  • 既然都排序好所以我會從後面出發

    • nums1[m] > nums2[n]: nums1[pointer] = nums1[m]

    • nums1[m] < nums2[n]: nums1[pointer] = nums2[n]

var merge = function(nums1, m, nums2, n) {
    let pointer = m + n;
    m --;
    n --;
    // 從最後比
    while(pointer > 0 ){
      pointer --;
      if(n < 0 || nums1[m] > nums2[n]){
        nums1[pointer] = nums1[m]  
        m --;
      }else{
        nums1[pointer] = nums2[n];
        n -- ;
      }
      
    }
    return nums1;
};
// aster than 23.03%

後來發現這樣更快

let totalLen = m+n;
nums1.length = totalLen;
先指定 nums1 長度,到時候把值塞進去是 O(n)

學到什麼

我一開始是用 for 但卻沒有想到 [0], 0, [1], 1 的情況,後來用 for 就解決了

Last updated