Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.
Note:
You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2. The number of elements initialized in nums1 and nums2 are m and n respectively.
void merge(int* nums1, int m, int* nums2, int n)
{
int i = m - 1;
int j = n - 1;
int k = m + n - 1;
while(k >= 0)
{
/*两个数组均有元素,需要比较*/
if(i >= 0 && j >= 0)
{
if(nums1[i] < nums2[j])
{
nums1[k] = nums2[j];
j--;
}
else
{
nums1[k] = nums1[i];
i--;
}
}
/*nums1数组还有剩余元素*/
else if(i >= 0)
{
nums1[k] = nums1[i];
i--;
}
/*nums2数组还有剩余元素*/
else if (j >= 0)
{
nums1[k] = nums2[j];
j--;
}
k--;
}
}
经验教训
nums1和nums2都已经是排好序的数组,我们只需要从后往前比较就可以了。
因为nums1有足够的空间容纳m + n,我们使用k指向m + n - 1,也就是最大数值存放的地方,从后往前遍历nums1 nums2,谁大就放到k这里,同时递减k。
88这道或许是整个LeetCode上最简单的题了,前后编写提交不超过5min搞定。
2021.02.19更新
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int k = 0;
for(int i = m -1,j = n - 1;i>=0&&j>=0;)
{
if(nums1[i] < nums2[j])
nums1[m+n-1-k++] = nums2[j--];
else
nums1[m+n-1-k++] = nums1[i--];
}
}
上面的代码在处理如下case时存在问题:
vector<int> nums1 = {0};
vector<int> nums2 = {1};
merge(nums1,0,nums2,1);
return 0;
正确的形式是使用一个确定的量,比如最终的元素个数必然是m+n个,下标最大m+n-1:
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int k = m + n - 1;
int i = m - 1,j = n - 1;
while(k >= 0)
{
if(i >=0 &&j>=0)
{
if(nums1[i] < nums2[j])
nums1[k] = nums2[j--];
else
nums1[k] = nums1[i--];
}
else if(i >= 0)
nums1[k] = nums1[i--];
else if(j >= 0)
nums1[k] = nums2[j--];
k--;
}
}
};