问题:
两个有序数组,合并成一个有序数组,假设第一个数组空间足够容纳两个数组。
分析:
考虑到num1数组很大,可以直接在num1数组上进行合并,但是要讲究效率。如果单纯从前往后合并,那么效率会非常低,因为a数组后面的数字需要进行多次的移动,时间复杂度为O(n^2)
换一种思路,我们采用从后往前合并,首先计算出总长度,设置指针num1和num2分别指向原先两个数组的最后一个元素,newIndex表示新的数组的最后一个元素,然后开始对应的元素复制即可,直到num2中的所有元素都被复制进num1
代码如下:
1 void merge(int *nums1, int m, int *nums2, int n)
2 {
3 int newIndex = m + n - 1;
4 int nums1I = m - 1, nums2I = n - 1;
5 while (nums1I >= 0 && nums2I >= 0)
6 {
7 if (nums1[nums1I] >= nums2[nums2I])
8 {
9 nums1[newIndex] = nums1[nums1I];
10 newIndex--;
11 nums1I--;
12 }
13 else
14 {
15 nums1[newIndex] = nums2[nums2I];
16 newIndex--;
17 nums2I--;
18 }
19 }
20 //关于nums1的判决其实可以不需要
21 /*while (nums1I >= 0)
22 {
23 nums1[newIndex] = nums1[nums1I];
24 newIndex--;
25 nums1I--;
26 }*/
27 while (nums2I >= 0)
28 {
29 nums1[newIndex] = nums2[nums2I];
30 newIndex--;
31 nums2I--;
32 }
33 }