1. 题目
合并两个有序数组
假设nums1有足够的空间(>=m+n)来保存nums2中的附加元素
2. 分析
采用归并排序的思想
1:两数组都有序,所以按顺序比较大小即可。
建立一个长度为m+n的total数组,逐个比较nums1、nums2数组中的元素,
先将较小元素放入total,再考虑两数组剩余元素,
最后再把total的元素重新赋值到A数组中。
2:由于nums1有足够空间,所以可以从后到前遍历,无须开辟新数组
3. 代码
1)
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
if(m < 0 || n < 0)
return;
int len = m + n;
int *total = new int[len];
int i = 0, j = 0, k = 0;
while(i < m && j <n)
{
if(nums1[i] <= nums2[j])
{
total[k++] = nums1[i++];
}
else
{
total[k++] = nums2[j++];
}
}
while(i < m)
{
total[k++] = nums1[i++];
}
while(j < n)
{
total[k++] = nums2[j++];
}
for(int p = 0; p < len; ++p)
nums1[p] = total[p];
}
};
2)
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
if(m < 0 || n < 0)
return;
int k = m + n - 1;
--m;
--n;
while(m >= 0 && n >= 0)
{
if(nums1[m] > nums2[n])
nums1[k--] = nums1[m--];
else
nums1[k--] = nums2[n--];
}
while(n >= 0)
nums1[k--] = nums2[n--];
return;
}
};