给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
说明:
- 初始化 nums1 和 nums2 的元素数量分别为 m 和 n。
- 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
示例:
输入: nums1 = [1,2,3,0,0,0], m = 3 nums2 = [2,5,6], n = 3 输出: [1,2,2,3,5,6]
分析:
1. 创建一个新的数组,用两个指针分别指向两个数组,每次将其中小的数字保存下来,空间复杂度O(m+n)
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
// 前后指针
int p = 0; // nums1的指针
int q = 0; // nums2的指针
// 保存中间结果
vector<int> result;
// 移动
while(p < m && q < n){
if(nums1[p] < nums2[q]){
result.push_back(nums1[p]);
p++;
}else{
result.push_back(nums2[q]);
q++;
}
}
// 移动剩下的
while(p<m){
result.push_back(nums1[p]);
p++;
}
while(q < n){
result.push_back(nums2[q]);
q++;
}
nums1 = result;
}
};
2. nums1有足够的空间来保存合并的数组,可以从后往前进行比较,将大的数字放在nums1的末尾
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
// 从后往前比较,将大的数字保存到Nums1的末尾
int save = m+n-1; // 最大的数字保存的位置
// 得到下标
m --;
n --;
// 移动
while(m >= 0 && n >= 0){
nums1[save] = max(nums1[m], nums2[n]);
nums1[m]>nums2[n]?m--:n--;
save --;
}
// 移动剩下的,nums1不用移动
while(n >= 0){
nums1[save] = nums2[n];
n--;
save--;
}
}
int max(int a,int b){
return a>b?a:b;
}
};