合并两个有序数组
问题:
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。
思路:
法一:超简单,将两数组直接合并后排序。
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) const {
while(n-- > 0) {
nums1[m++] = nums2[n];
}
sort(nums1.begin(), nums1.end());
}
};
时间复杂度:O( (m+n)*(log(m + n) )
空间复杂度:O(log(m + n) ) (sort 采用快排序方法,平均空间复杂度为 log(m + n))
法二:
逆双指针法
p1 指向 nums1 的有效元素最后一位,p2 指向 nums2 的最后一位。
逐位前移,将大的元素放入对应的 nums1 数组中。
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) const {
auto p1 = m - 1;
auto p2 = n - 1;
auto tail = m + n - 1;
auto temp = -1;
while(p1 >= 0 || p2 >= 0) {
if(p1 == -1) {
temp = nums2[p2--];
}
else if(p2 == -1) {
temp = nums1[p1--];
}
else if(nums1[p1] > nums2[p2]) {
temp = nums1[p1--];
}
else {
temp = nums2[p2--];
}
nums1[tail--] = temp;
}
}
};