Striver's SDE Sheet Journey - #9 Merge two sorted Arrays
Tags: programming, beginners, dsa
Published: 2021-12-30 12:09:01

> **<u>Problem Statement</u> :-**

_You are given two integer arrays nums1 and nums2, sorted in **non-decreasing** order, and two integers m and n, representing the number of elements in nums1 and nums2 respectively._

_Merge nums1 and nums2 into a single array sorted in non-decreasing order._

**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]
```
**Explanation :** _The arrays we are merging are [1,2,3] and [2,5,6].
The result of the merge is [1,<u>2</u>,2,3,<u>5</u>,<u>6</u>] with the underlined elements coming from nums1_

##  <u>Solution 1</u>
sort the `num1` array by swapping num2 array elements, while swapping keep sorting num2, then add all num2 elements to num1  array.

lets understand this approach step by step.

**step-1** Initialise two varible `pointer1 = 0` & `pointer2 = 0`.

**step-2** if `n == 0` , then return.

**step-3** run a loop from `i=1` to `m`,then

 > if  `num1[pointer1] > num2[pointer2]`,then
   >>  **1.** swap(num1[pointer1],num2[pointer2]).
   >>  **2.** sort the `num2` array.
   >>  **3.** increment `pointer1`++

 > else increment `pointer1`++

**step-4** again run a loop from i=1 to n,then
  > **1.** `num1[pointer1] = num2[pointer2]`
  > **2.** increment the `pointer2`++.

**step-5** end.


> Java

```java
class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int pointer1=0, pointer2=0;
        
        if(n==0) return;
 
        for(int i=0; i<m;i++){
            if(nums1[pointer1] > nums2[pointer2]){
                int temp = nums1[pointer1];
                nums1[pointer1] = nums2[pointer2];
                nums2[pointer2] = temp;
                Arrays.sort(nums2);
                pointer1++;
            }else
            pointer1++;
                
        }
        
            
            for(int i=1;i<=n;i++){
                nums1[pointer1] = nums2[pointer2];
                pointer1++;
                pointer2++;
            }
 
    }
}
```
##  <u>Solution 2</u>
by reverse sorting, this problem can be solved in linear time complexity.

**step-1** initialise variables `i=m-1`, `j=n-1`, `arr1Len=nums1.length-1`.

**step-2** run a loop if `i>=0 and j>=0`, then
 > if nums1[i] > nums2[j], then
   > update the value from the last index.
      `nums1[arr1Len] = nums[i];`
   > `i--`
   > `arr1Len--`
 > else
   > `nums1[arr1Len] = nums[j]`
   > `j--`
   > `arr1Len--`

**srep-3** run a loop if j >=0, then
 > `nums1[arr1Len] = nums[j]`
 > `arr1Len--`
 > `j--`

**step-4** end.

> Java

```java
class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
      int i=m-1,j=n-1,arr1Len=nums1.length-1;
        
        while(i>=0 && j>=0){
            if(nums1[i] > nums2[j]){
                nums1[arr1Len] = nums1[i];
                i--;
                arr1Len--;
            }else{
                nums1[arr1Len] = nums2[j];
                j--;
                arr1Len--;
            }
        }
        
        while(j>=0){
            nums1[arr1Len] = nums2[j];
            j--;
            arr1Len--;
        }
    }
}
```
**Time Complexity :** **O(m+n)**

**Space Complexity :** **O(1)**

Thank you for reading this article. if you find something wrong, let me know in the comment section.