1. 程式人生 > 實用技巧 >0088. Merge Sorted Array (E)

0088. Merge Sorted Array (E)

Merge Sorted Array (E)

題目

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
    .

Example:

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

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

題意

將兩個有序陣列nums1和nums2合併成一個新的有序陣列,且直接儲存在nums1中。

思路

最簡單的方法是新建一個m+n的新陣列,歸併排序後再複製到nums1中。但題目的意思很顯然是不希望使用額外空間,因此可以採取以下做法:從nums1[m-1]和nums2[n-1]開始,向前遍歷進行歸併排序,將較大的值從nums1的m+n-1處開始依次向前存放。


程式碼實現

Java

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int i = m - 1, j = n - 1;
        int p = m + n - 1;

        while (i >= 0 && j >= 0) {
            if (nums1[i] < nums2[j]) {
                nums1[p--] = nums2[j--];
            } else {
                nums1[p--] = nums1[i--];
            }
        }

        while (j >= 0) {
            nums1[p--] = nums2[j--];
        }
    }
}

JavaScript

/**
 * @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) {
    let i = m - 1
    let j = n - 1
    let k = m + n - 1
    while (i >= 0 && j >= 0) {
        nums1[k--] = nums1[i] <= nums2[j] ? nums2[j--] : nums1[i--]
    }
    while (j >= 0) {
        nums1[k--] = nums2[j--]
    }
}