1. 题目描述
2. 思路分析
看到这道题,我们注意到nums1[ ]和nums2[ ]两个数组都是非递减的。所以我们很容易想到额外开一个数组tmp[ ],依次比较两个数组的元素,每次取小的尾插到新数组tmp[ ]即可。但是这需要额外再开空间。
也有一种方法是将这两个数组的元素都拷贝到一起,然后使用qsort排序 复杂度为O(NlogN)。
显然这两种方法的复杂度都不够优秀,是否有更好的方法呢?
我们可以倒着比较,取大的依次往前插入。等到有一个数组被遍历完,就结束。
因为两个数组都是非递减的,nums1[ ]数组的长度比nums2[ ]大,所以如果nums1[ ]先被遍历完,就将nums2[ ]没有被遍历的元素直接拷贝到nums1[ ]前面。
如果nums2[ ]先被遍历完,则不用额外操作(因为nums1[ ]整体本身就是非递减的,所以那些没有被遍历到的元素也是按非递减排列的)。
流程演示:
3. 代码实现
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
int end1 = m - 1, end2 = n - 1, end = m + n - 1;
while (end1 >= 0 && end2 >= 0)
{
if (nums1[end1] >= nums2[end2])
nums1[end--] = nums1[end1--];
else
nums1[end--] = nums2[end2--];
}
while (end2 >= 0)
nums1[end--] = nums2[end2--];
}