88. 合并两个有序数组
难度:Easy
题目描述:
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
说明:
初始化 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. 合并再排序:
先把两个数组合并为一个,然后直接排序。
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
for(int n:nums2)
nums1[m++] = n;
sort(nums1.begin(),nums1.end());
}
};
2. 复制nums1, 然后依次插入:
先把nums1复制到temp数组中,然后对temp nums2依次插入到num1中
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
vector<int> temp(nums1); //初始化m为nums1的拷贝
int i = 0, j = 0, k = 0;
while(i <= m-1 && j <= n-1)
{
if(temp[i] < nums2[j]) nums1[k++] = temp[i++];
else nums1[k++] = nums2[j++];
}
while(i <= m-1)
{
nums1[n+i] = temp[i];
i++;
}
while(j <= n-1)
{
nums1[m+j] = nums2[j];
j++;
}
}
};
3. 从后向前
- 用一个指针指向m+n-1的位置,也就是排满nums1中的最后一个位置。
- 然后两个数组从最后一位比较,大的放到最后的位置。
- 注意要额外判断第一个数组全部已经排到后面的情况。
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int last = m + n - 1; // 指向nums1中m+n个数的末尾
while(n > 0){
if(m == 0){ // 第一个数组处理完毕了
nums1[last] = nums2[--n];
}
else if(nums1[m - 1] > nums2[n - 1]){
nums1[last] = nums1[--m];
}else{
nums1[last] = nums2[--n];
}
last--;
}
}
};