Given two sorted arrays arr1[] of size n and arr2[] of size m. Merge these two arrays.
After the merge, the first n smallest elements of the combined sorted array should be stored in arr1[], and the remaining m largest elements should be stored in arr2[]. After the merging process, both arr1[] and arr2[] must remain sorted in non-decreasing order.
Examples:
Input: arr1[] = [1, 3, 4, 5], arr2[] = [2, 4, 6, 8]
Output: arr1[] = [1, 2, 3, 4], arr2[] = [4 5, 6, 8]
Explanation: Combined sorted array = [1, 2, 3, 4, 4, 5, 6, 8], array arr1[] contains smallest 4 elements: 1, 2, 3, 4, and array arr2[] contains the remaining 4 elements: 4, 5, 6, 8.
Input: arr1[] = [5, 8, 9], arr2[] = [4, 7, 8]
Output: arr1[] = [4, 5, 7], arr2[] = [8, 8, 9]
Explanation: Combined sorted array = [4, 5, 7, 8, 8, 9], array arr1[] contains smallest 3 elements: 4, 5, 7, and array arr2[] contains the remaining 3 elements: 8, 8, 9.
[Naive Approach] Concatenate and Sort - O((n + m) log(n + m)) Time and O(n + m) Space
The idea is to combine both sorted arrays into a single temporary array, then sort this combined array to get all elements in non-decreasing order. Once sorted, the first n smallest elements are copied back into arr1, and the remaining m largest elements are placed into arr2.
C++
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void mergeArrays(vector<int>& arr1, vector<int>& arr2) {
int n = arr1.size();
int m = arr2.size();
// temporary array to store all elements
// from arr1 and arr2
vector<int> merged(n + m);
// copy elements from arr1 and arr2 into merged array
for (int i = 0; i < n; ++i) {
merged[i] = arr1[i];
}
for (int j = 0; j < m; ++j) {
merged[n + j] = arr2[j];
}
// dort the merged array
sort(merged.begin(), merged.end());
// distribute first n elements to arr1
for (int i = 0; i < n; ++i) {
arr1[i] = merged[i];
}
// distribute remaining m elements to arr2
for (int j = 0; j < m; ++j) {
arr2[j] = merged[n + j];
}
}
int main() {
vector<int> arr1 = {1, 3, 5, 7};
vector<int> arr2 = {2, 4, 6, 8};
mergeArrays(arr1, arr2);
for (int num : arr1) {
cout << num << ' ';
}
cout << endl;
for (int num : arr2) {
cout << num << ' ';
}
cout << endl;
return 0;
}
C
#include <stdio.h>
#include <stdlib.h>
// function to compare two integers (used in qsort)
int compare(void* a, void* b) {
return (*(int*)a - *(int*)b);
}
// function to merge two sorted arrays in-place
void mergeArrays(int arr1[], int arr2[], int n, int m) {
// temporary array to store all elements
// from arr1 and arr2
int* merged = (int*)malloc((n + m) * sizeof(int));
// copy elements from arr1 and arr2 into merged array
for (int i = 0; i < n; ++i) {
merged[i] = arr1[i];
}
for (int j = 0; j < m; ++j) {
merged[n + j] = arr2[j];
}
// sort the merged array
qsort(merged, n + m, sizeof(int), compare);
// distribute first n elements to arr1
for (int i = 0; i < n; ++i) {
arr1[i] = merged[i];
}
// distribute remaining m elements to arr2
for (int j = 0; j < m; ++j) {
arr2[j] = merged[n + j];
}
// free dynamically allocated memory
free(merged);
}
int main() {
int arr1[] = {1, 3, 5, 7};
int arr2[] = {2, 4, 6, 8};
int n = sizeof(arr1) / sizeof(arr1[0]);
int m = sizeof(arr2) / sizeof(arr2[0]);
mergeArrays(arr1, arr2, n, m);
for (int i = 0; i < n; ++i) {
printf("%d ", arr1[i]);
}
printf("\n");
for (int i = 0; i < m; ++i) {
printf("%d ", arr2[i]);
}
printf("\n");
return 0;
}
Java
import java.util.Arrays;
class GfG {
static void mergeArrays(int[] arr1, int[] arr2) {
int n = arr1.length;
int m = arr2.length;
// temporary array to store all elements
// from arr1 and arr2
int[] merged = new int[n + m];
// copy elements from arr1 and arr2 into merged array
for (int i = 0; i < n; ++i) {
merged[i] = arr1[i];
}
for (int j = 0; j < m; ++j) {
merged[n + j] = arr2[j];
}
// sort the merged array
Arrays.sort(merged);
// distribute first n elements to arr1
for (int i = 0; i < n; ++i) {
arr1[i] = merged[i];
}
// distribute remaining m elements to arr2
for (int j = 0; j < m; ++j) {
arr2[j] = merged[n + j];
}
}
public static void main(String[] args) {
int[] arr1 = {1, 3, 5, 7};
int[] arr2 = {2, 4, 6, 8};
mergeArrays(arr1, arr2);
for (int num : arr1) {
System.out.print(num + " ");
}
System.out.println();
for (int num : arr2) {
System.out.print(num + " ");
}
System.out.println();
}
}
Python
def mergeArrays(arr1, arr2):
n = len(arr1)
m = len(arr2)
# temporary array to store all elements
# from arr1 and arr2
merged = [0] * (n + m)
# copy elements from arr1 and arr2
# into merged array
for i in range(n):
merged[i] = arr1[i]
for j in range(m):
merged[n + j] = arr2[j]
# sort the merged array
merged.sort()
# distribute first n elements to arr1
for i in range(n):
arr1[i] = merged[i]
# distribute remaining m elements to arr2
for j in range(m):
arr2[j] = merged[n + j]
if __name__ == "__main__":
arr1 = [1, 3, 5, 7]
arr2 = [2, 4, 6, 8]
mergeArrays(arr1, arr2)
print(*arr1)
print(*arr2)
C#
using System;
class GfG {
static void mergeArrays(int[] arr1, int[] arr2) {
int n = arr1.Length;
int m = arr2.Length;
// temporary array to store all elements
// from arr1 and arr2
int[] merged = new int[n + m];
// copy elements from arr1 and arr2
// into merged array
for (int i = 0; i < n; ++i) {
merged[i] = arr1[i];
}
for (int j = 0; j < m; ++j) {
merged[n + j] = arr2[j];
}
// sort the merged array
Array.Sort(merged);
// distribute first n elements to arr1
for (int i = 0; i < n; ++i) {
arr1[i] = merged[i];
}
// distribute remaining m elements to arr2
for (int j = 0; j < m; ++j) {
arr2[j] = merged[n + j];
}
}
static void Main() {
int[] arr1 = {1, 3, 5, 7};
int[] arr2 = {2, 4, 6, 8};
mergeArrays(arr1, arr2);
foreach (int num in arr1) {
Console.Write(num + " ");
}
Console.WriteLine();
foreach (int num in arr2) {
Console.Write(num + " ");
}
Console.WriteLine();
}
}
JavaScript
function mergeArrays(arr1, arr2) {
let n = arr1.length;
let m = arr2.length;
// temporary array to store all elements
// from arr1 and arr2
let merged = new Array(n + m);
// copy elements from arr1 and arr2
// into merged array
for (let i = 0; i < n; ++i) {
merged[i] = arr1[i];
}
for (let j = 0; j < m; ++j) {
merged[n + j] = arr2[j];
}
// sort the merged array
merged.sort((a, b) => a - b);
// distribute first n elements to arr1
for (let i = 0; i < n; ++i) {
arr1[i] = merged[i];
}
// distribute remaining m elements to arr2
for (let j = 0; j < m; ++j) {
arr2[j] = merged[n + j];
}
}
// Driver Code
let arr1 = [1, 3, 5, 7];
let arr2 = [2, 4, 6, 8];
mergeArrays(arr1, arr2);
console.log(arr1.join(' '));
console.log(arr2.join(' '));
[Expected Approach] Two Pointer Merge - O(n + m) Time and O(n + m) Space
The idea is to use the two-pointer to merge both sorted arrays into a temporary array in linear time. We compare elements from arr1 and arr2 one by one and append the smaller element to the merged array. After merging, we copy the first n elements back to arr1 and the remaining m elements to arr2.
Step-by-Step Implementation:
- Initialize two pointers: i = 0 for traversing arr1, j = 0 for traversing arr2
- Create an empty array merged = []
- Merge the elements into merged: While both i < n and j < m:
=> If arr1[i] <= arr2[j], append arr1[i] to merged and increment i
=> Else, append arr2[j] to merged and increment j - Append remaining elements (if any):
=> While i < n, append arr1[i] to merged and increment i
=> While j < m, append arr2[j] to merged and increment j - Distribute the merged elements back:
=> Copy the first n elements of merged to arr1
=> Copy the remaining m elements to arr2
C++
#include <iostream>
#include <vector>
using namespace std;
void mergeArrays(vector<int>& arr1, vector<int>& arr2) {
int n = arr1.size();
int m = arr2.size();
int i = 0, j = 0;
// temporary array to store merged result
vector<int> merged;
// merge elements in sorted order
while (i < n && j < m) {
if (arr1[i] <= arr2[j]) {
merged.push_back(arr1[i++]);
} else {
merged.push_back(arr2[j++]);
}
}
// copy remaining elements from arr1
while (i < n) merged.push_back(arr1[i++]);
// copy remaining elements from arr2
while (j < m) merged.push_back(arr2[j++]);
// copy first n to arr1
for (int k = 0; k < n; ++k) {
arr1[k] = merged[k];
}
// copy remaining m to arr2
for (int k = 0; k < m; ++k) {
arr2[k] = merged[n + k];
}
}
int main() {
vector<int> arr1 = {1, 3, 5, 7};
vector<int> arr2 = {2, 4, 6, 8};
mergeArrays(arr1, arr2);
for (int num : arr1) cout << num << ' ';
cout << endl;
for (int num : arr2) cout << num << ' ';
cout << endl;
return 0;
}
C
#include <stdio.h>
#include <stdlib.h>
void mergeArrays(int arr1[], int arr2[], int n, int m) {
int* merged = (int*)malloc((n + m) * sizeof(int));
int i = 0, j = 0, k = 0;
// merge elements in sorted order
while (i < n && j < m) {
if (arr1[i] <= arr2[j]) {
merged[k++] = arr1[i++];
} else {
merged[k++] = arr2[j++];
}
}
// copy remaining elements from arr1
while (i < n) merged[k++] = arr1[i++];
// copy remaining elements from arr2
while (j < m) merged[k++] = arr2[j++];
// copy first n to arr1
for (i = 0; i < n; ++i)
arr1[i] = merged[i];
// copy remaining m to arr2
for (j = 0; j < m; ++j)
arr2[j] = merged[n + j];
free(merged);
}
int main() {
int arr1[] = {1, 3, 5, 7};
int arr2[] = {2, 4, 6, 8};
int n = sizeof(arr1) / sizeof(arr1[0]);
int m = sizeof(arr2) / sizeof(arr2[0]);
mergeArrays(arr1, arr2, n, m);
for (int i = 0; i < n; ++i) printf("%d ", arr1[i]);
printf("\n");
for (int i = 0; i < m; ++i) printf("%d ", arr2[i]);
printf("\n");
return 0;
}
Java
class GfG {
static void mergeArrays(int[] arr1, int[] arr2) {
int n = arr1.length, m = arr2.length;
int i = 0, j = 0;
int[] merged = new int[n + m];
// merge elements in sorted order
int k = 0;
while (i < n && j < m) {
if (arr1[i] <= arr2[j]) {
merged[k++] = arr1[i++];
} else {
merged[k++] = arr2[j++];
}
}
// copy remaining elements from arr1
while (i < n) merged[k++] = arr1[i++];
// copy remaining elements from arr2
while (j < m) merged[k++] = arr2[j++];
// copy first n to arr1
for (i = 0; i < n; ++i)
arr1[i] = merged[i];
// copy remaining m to arr2
for (j = 0; j < m; ++j)
arr2[j] = merged[n + j];
}
public static void main(String[] args) {
int[] arr1 = {1, 3, 5, 7};
int[] arr2 = {2, 4, 6, 8};
mergeArrays(arr1, arr2);
for (int num : arr1) System.out.print(num + " ");
System.out.println();
for (int num : arr2) System.out.print(num + " ");
System.out.println();
}
}
Python
def mergeArrays(arr1, arr2):
n = len(arr1)
m = len(arr2)
i = j = 0
# temporary array to store merged result
merged = []
# merge elements in sorted order
while i < n and j < m:
if arr1[i] <= arr2[j]:
merged.append(arr1[i])
i += 1
else:
merged.append(arr2[j])
j += 1
# copy remaining elements from arr1
while i < n:
merged.append(arr1[i])
i += 1
# copy remaining elements from arr2
while j < m:
merged.append(arr2[j])
j += 1
# copy first n to arr1
for i in range(n):
arr1[i] = merged[i]
# copy remaining m to arr2
for j in range(m):
arr2[j] = merged[n + j]
if __name__ == "__main__":
arr1 = [1, 3, 5, 7]
arr2 = [2, 4, 6, 8]
mergeArrays(arr1, arr2)
print(*arr1)
print(*arr2)
C#
using System;
class GfG {
static void mergeArrays(int[] arr1, int[] arr2) {
int n = arr1.Length, m = arr2.Length;
int i = 0, j = 0;
int[] merged = new int[n + m];
int k = 0;
// merge elements in sorted order
while (i < n && j < m) {
if (arr1[i] <= arr2[j]) {
merged[k++] = arr1[i++];
} else {
merged[k++] = arr2[j++];
}
}
// copy remaining elements from arr1
while (i < n) merged[k++] = arr1[i++];
// copy remaining elements from arr2
while (j < m) merged[k++] = arr2[j++];
// copy first n to arr1
for (i = 0; i < n; ++i)
arr1[i] = merged[i];
// copy remaining m to arr2
for (j = 0; j < m; ++j)
arr2[j] = merged[n + j];
}
static void Main() {
int[] arr1 = {1, 3, 5, 7};
int[] arr2 = {2, 4, 6, 8};
mergeArrays(arr1, arr2);
foreach (int num in arr1) Console.Write(num + " ");
Console.WriteLine();
foreach (int num in arr2) Console.Write(num + " ");
Console.WriteLine();
}
}
JavaScript
function mergeArrays(arr1, arr2) {
let n = arr1.length, m = arr2.length;
let i = 0, j = 0;
let merged = [];
// merge elements in sorted order
while (i < n && j < m) {
if (arr1[i] <= arr2[j]) {
merged.push(arr1[i++]);
} else {
merged.push(arr2[j++]);
}
}
// copy remaining elements from arr1
while (i < n) merged.push(arr1[i++]);
// copy remaining elements from arr2
while (j < m) merged.push(arr2[j++]);
// copy first n to arr1
for (let k = 0; k < n; ++k)
arr1[k] = merged[k];
// copy remaining m to arr2
for (let k = 0; k < m; ++k)
arr2[k] = merged[n + k];
}
// Driver Code
let arr1 = [1, 3, 5, 7];
let arr2 = [2, 4, 6, 8];
mergeArrays(arr1, arr2);
console.log(arr1.join(' '));
console.log(arr2.join(' '));
Merge two sorted arrays with O(1) extra space
Merge k sorted arrays
Union of Two Sorted Arrays
Intersection of Two Sorted Arrays
Merge 2 sorted linked list in reverse order
Sort last M elements
Merge 2 sorted linked list in reverse order
Merge Sort for Doubly Linked List
Merge two sorted arrays - SDE Sheet
Explore
DSA Fundamentals
Data Structures
Algorithms
Advanced
Interview Preparation
Practice Problem