法一:简单暴力解题法
将第二个数组中的元素逐个插入第一个数组中并直接对第一个数组进行排序,这样的时间复杂度为O((m+n)!)并且占用了较大的内存空间。m,n分别为两个数组的长度。
法二:双指针
因为要求合并后的数组仍是非递减顺序排列,我定义三个指针。首先nums1长度是m+n的,所以我们只需要从尾部进行操作就可以了的,首先设置三个指针m,n,i,m去指向nums1[m-1]的,n指向nums2[n-1],而i指向nums1[m+n-1],然后向前遍历就可以了,停止条件是m>=0以及n>=0,nums1[m]比较nums2[n],谁大就放谁的,如果小了就在nums1中交换进去。一个是从后往前确定两组中该用哪个数字,另一个是结束条件以第二个数组全都插入进去为止。
while (n >= 0) {
while (m >= 0 && nums1[m] > nums2[n]) {
swap(nums1[i--], nums1[m--]);
}
swap(nums1[i--], nums2[n--]);
}
为什么是首先是while(n>=0)呢?因为swap(nums1[i--], nums2[n--]);这样才不会死循环的。
全部c语言代码。
int i=m+n-1;
m--;
n--;
while(n>=0)
{
while(m>=0&&nums1[m]>nums2[n])
{
swap(nums1[i--], nums1[--]);
}
swap(nums1[i--], nums2[n--]);
}
}