题目:
合并两个有序数组的核心思路:归并排序
做题方法:
1.开辟新空间,对两个数组进行排序
2.开辟一块新的空间,两数组比较 取小的尾插 尾插
3.不额外开辟空间,避免空间复杂度 (本篇详讲)
思路
据题意及示例分析num1的空间足够大
如左图示:如果从前向后移 可能覆盖前面的值
如左图 从后往前比较存储,避免了覆盖
分别定义num1、num2的结束位置 及合并后数组的结束位置
分析: 如果两组数中有一组已结束 则比较结束(剩余数字没得比 无参考)
- 如果num2先结束 num1其余元素保持不动
- 若比较后num1先结束 需挪动num2剩下的元素
代码展示:(根据题分析 直接上代码)
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
int end1 = m - 1; int end2 = n - 1;
int end = m + n - 1;//下标
while (end1>=0 && end2>=0)
{
if (nums1[end1] < nums2[end2])
{
nums1[end] = nums2[end2];
--end;
--end2;
}
else
{
nums1[end] = nums1[end1];
--end;
--end1;
}
}
while (end2>=0)
{
nums1[end] = nums2[end2];
--end;
--end2;
}
}
注意:
多画图 !多画图!
朴实无华的代码提交。