Given two sorted arrays a[] and b[] in non-decreasing order. Merge them in sorted order without using any extra space. Modify a so that it contains the first n elements and modify b so that it contains the last m elements.
Examples:
Input: a[] = [2, 4, 7, 10], b[] = [2, 3] Output:
2 2 3 4
7 10 Explanation: After merging the two non-decreasing arrays, we get, 2 2 3 4 7 10
Input: a[] = [1, 5, 9, 10, 15, 20], b[] = [2, 3, 8, 13] Output:
1 2 3 5 8 9
10 13 15 20 Explanation: After merging two sorted arrays we get 5 10 12 18 20.
Input: a[] = [0, 1], b[] = [2, 3] Output:
0 1
2 3 Explanation: After merging two sorted arrays we get 0 1 2 3.
Constraints:
1 <= a.size(), b.size() <= 105
0 <= a[i], b[i] <= 107
Approach 01:
-
C++
-
Python
#include <vector>
#include <algorithm>
class Solution {
public:
void mergeArrays(std::vector<int>& array1, std::vector<int>& array2) {
int array1Length = array1.size();
int array2Length = array2.size();
int array1Index = array1Length - 1;
int array2Index = 0;
while (array1Index >= 0 && array2Index < array2Length) {
if (array1[array1Index] >= array2[array2Index]) {
// Swap elements between array1 and array2
std::swap(array1[array1Index], array2[array2Index]);
array1Index--;
array2Index++;
} else {
break;
}
}
// Sort both arrays
std::sort(array1.begin(), array1.end());
std::sort(array2.begin(), array2.end());
}
};
class Solution:
def mergeArrays(self, array1, array2):
array1Length = len(array1)
array2Length = len(array2)
array1Index = array1Length - 1
array2Index = 0
while array1Index >= 0 and array2Index < array2Length:
if array1[array1Index] >= array2[array2Index]:
array1[array1Index], array2[array2Index] = array2[array2Index], array1[array1Index]
array1Index -= 1
array2Index += 1
else:
break
array1.sort()
array2.sort()
Time Complexity
- Swapping Elements:
- The `while` loop iterates as long as there are elements to compare and swap between the two arrays.
- The loop runs at most \(\min(n, m)\), where \(n\) and \(m\) are the lengths of `array1` and `array2`, respectively. This takes \(O(\min(n, m))\).
- Sorting:
- After swapping, both arrays are individually sorted.
- Sorting `array1` takes \(O(n \log n)\), and sorting `array2` takes \(O(m \log m)\).
- Overall Time Complexity:
The total time complexity is \(O(n \log n + m \log m)\), dominated by the sorting steps.
Space Complexity
- In-Place Operations:
- The swapping of elements between `array1` and `array2` is performed in-place, requiring \(O(1)\) extra space.
- Sorting Auxiliary Space:
- Sorting both arrays may require \(O(n)\) and \(O(m)\) additional space, depending on the sorting algorithm used (e.g., quicksort or mergesort).
- Other Variables:
- Variables like `array1Index`, `array2Index`, and loop variables require \(O(1)\) space.
- Overall Space Complexity:
The total space complexity is \(O(n + m)\), dominated by the sorting auxiliary space.