题目
两个按 非递减顺序 排列的整数数组 nums1
和 nums2
,另有两个整数 m 和 n ,分别表示 nums1
和 nums2
中的元素数目。
合并 nums2
到 nums1
中,使合并后的数组同样按 非递减顺序 排列。
合并后数组存储在数组 nums1
中。为了应对这种情况,nums1
的初始长度为 m + n
,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2
的长度为 n 。
从后面考虑问题,便于元素的挪位。
思路还是通过元素之间的比较,来进行选择填充。重点是循环的结束条件,边界分析。
void merge(int nums1[],int m,int nums2[],int n){
// nums1 数组空间为 m+n, 后面 n个空间用于容下 nums2
m--;
n--;
// 此时 m+n+1 是 nums1 数组的最大下标
while(n>=0){
// m>=0 是为了考虑 假设 nums1 自己本身没有元素,只给 nums2留了空间的这种情况。
// 以及 当 nums1 中的元素 都移完了 的情况。
// nums1>nums2, 则将nums1[m]移到后面,然后索引--
if(m>=0&&nums1[m]>nums2[n]){
nums1[m+n+1]=nums1[m--];
// nums1<=nums2, 将nums2[n]放到后面, nums2的索引--
}else{
nums1[m+n+1]=nums2[n--];
}
}
}