005 Merge Sorted Array

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

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 equal to m + n) to hold additional elements from nums2.

Example 1:

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

Example 2:

Input: nums1 = [1], m = 1, nums2 = [], n = 0
Output: [1]

Constraints:

  • 0 <= n, m <= 200

  • 1 <= n + m <= 200

  • nums1.length == m + n

  • nums2.length == n

  • -109 <= nums1[i], nums2[i] <= 109

Solution

Method 1

Code

public class Solution {
    public void Merge(int[] nums1, int m, int[] nums2, int n) {
        //put nums2 back nums1
        for(int index = 0; index < n; index++){
            nums1[m+index] = nums2[index];
        }
        
        foreach(int value in nums1){
            Console.WriteLine(value);
        }
        
        // bubble sort
        for(int i = 0; i < nums1.Length - 1 ; i++ ){
           for(int j =0; j<nums1.Length-1-i; j++){
               int temp = 0;
               if(nums1[j]>nums1[j+1]){
                   temp = nums1[j];
                   nums1[j] = nums1[j+1];
                   nums1[j+1] = temp;
               }
           }
        }
    }
}

Solution ideas

  1. Put nums2 back nums1

  2. Bubble sort

This method is simple but inefficient.

Method 2——Current best solution

public class Solution {
    public void Merge(int[] nums1, int m, int[] nums2, int n) {
        int i = m-1;
        int j = n-1;
        int index = m+n-1;
        while(i>=0 && j>=0){
            if(nums1[i]>nums2[j]){ // Compare the each last number
                nums1[index--] = nums1[i--];
            }
            else{
                nums1[index--] = nums2[j--];
            }
        }
        while(j>=0){
            nums1[index--] = nums2[j--];
        }                
    }
}

Solution ideas

From The Discuss Forum and link HERE

Last updated