目录
题目描述. - 力扣(LeetCode):
答案展示:
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
int l1 = m - 1;
int l2 = n - 1;
int l3 = m + n - 1;
while(l1>=0&&l2>=0)
{
if(nums1[l1]>nums2[l2])
nums1[l3--] = nums1[l1--];
else
nums1[l3--] = nums2[l2--];
}
if(l2>=0)
{
while(l2>=0)
{
nums1[l3--] = nums2[l2--];
}
}
}
题目讲解:
思路简析:
题目要求在原数组上改进,最后结果在nums1中。
本题有三个思路:
- 将nums2数组拷贝到nums1中后,进行排序
- 额外开辟一个数组,用来贮存num1的内容,然后用两个指针分别从头到尾遍历nums1_copy与nums2,将更大的数字放入num1中,所以一共使用了三个指针。
- 本文中使用的方法,同样使用三个指针,从后往前遍历三个数组,这利用了数组是非降序数组,即元素是升序或者齐平的条件,避免了开辟第三个空间。
过程讲解:
针对第三条思路进行代码讲解,分别建立三个指针,l1指向nums1的有效部分的尾元素,l2指向nums1的尾元素,l3指向nums2的尾元素。这里就会有两种情况,第一种l1从后往前遍历,并且比l2先完成遍历,即 l1 < 0 && l2 > 0。第二种反之。而第二种情况下,l2 中仍有剩余元素未处理,所以需要对 l2 中的元素单独处理。值得注意的是,这两段的执行条件都需要包含 l1,l2 等于 0。