题目如下:
解题思路:
从后往前比较大小,大的放后面。建立三指针变量l1(list1)、l2、l3,其中l1、l2分别指向两个数组中的最后一位有效数据,l3指向数组nums1中的最后一个位置,用来存放比较结果中较大的数据。
- nums[l1] < nums[l2],nums[l3 - -] = nums[l2 - -]
- nums[l1] >= nums[l2],nums[l3 - -] = nums[l1 - -]
对示例1画出每一步的变化图:
不难看出:
- 只要l1或l2越界(只要有一个为假),那么就会终止比较大小,也就是会终止循环。那么就可以写出进入循环的条件,
while (l1 >= 0 && l2 >= 0)
- l3初始值是
m+n-1
完整代码如下:
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
int l1 = m - 1, l2 = n - 1, l3 = m + n - 1;
while (l1 >= 0 && l2 >= 0)
{
if (nums1[l1] > nums2[l2])
{
nums1[l3--] = nums1[l1--];
}
else
{
nums1[l3--] = nums2[l2--];
}
}
while (l2 >= 0)
{
nums1[l3--] = nums2[l2--];
}
}
时间复杂度:O(n + n) -->O(2n)–>O(n),空间复杂度:O(1)