[LIR] Chapter 1 - 4

187 阅读1分钟

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]

the special thing about this problem is that you have to realize that the length of nums1 is not m. but clearly mentioned in the problem description: there must be enough space in nums1 for the result.

also note that the type of solution function is void which means you have to adapt the change in nums1 rather than return a new array.

Double pointer is a efficient way to merge and is also used in merge sort.

java code:

public static void merge(int[] nums1, int m, int[] nums2, int n){
    int[] ans = new int[nums1.length];
    int i = 0, j = 0, k = 0;
    while(i < m && j < n){
        ans[k++] = (nums1[i] <= nums2[j]) ? nums1[i++] : nums2[j++];
        //the smaller one is copied and move on the corresponding pointer, the other one stays right there.
    }
    //copy the rest.
    while(i < m){
        ans[k++] = nums1[i++];
    }
    while(j < n){
        ans[k++] = nums2[j++];
    }
    for(int ii = 0; ii < nums1.length; ii++){
        nums1[ii] = ans[ii];
    }
}

another method is to brutely copy and then sort with built-in function.

java code:

public static void merge(int[] nums1, int m, int[] nums2, int n){
    //since m nums in nums1 and the space is reserved for nums2 nums
    System.arraycopy(nums2, 0, nums1, m, n);
    Arrays.sort(nums1);
}

it's hard to beleive this function with O((n+m)log(n+m)) has beaten more than 70% of them.