题目描述:
Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.
Note:
You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2. The number of elements initialized in nums1 and nums2 are m and n respectively.
题目给我们两个排序完毕的动态数组,让我们融合这两个数组,融合的数组还得是排好序的。其中nums1这个数组的范围是m+n。
解题思路:
这道题的思路并不难想,就是细节处理比较麻烦。
这道题的解决方法肯定是两个数组的数进行逐个比较,逐个融入。问题是从前面开始比较好?还是从后面开始比较好?从前面开始比较的话,若是我们要融入一个数,肯定要把融入数的位置后面的数全都向后推一位。从后面开始比较的话,我们可以把较大的数直接放在nums1数组的末尾。所以我选择从后面开始比较。
大体的解决方案有了,还要考虑一些特殊情形:
1.nums1数组的元素全部排完,nums2数组的元素还没排完。
这说明nums1中的最小元素要比nums2剩余元素都要大,只要接着把nums2的剩余元素放入nums1中就行了。
2.num2数组的元素全部排完,nums1数组的元素还没排完。
这说明nums2中的最小元素要比nums1剩余元素都要大,这种情况相当于已经结束融合,可以返回了。
3.nums1数组元素的个数m为0且nums2数组元素的个数n不为0。
这种情况把nums2数组直接复制到nums1中即可。
4.nums2数组元素的个数n为0。
直接返回nums1。
在这4种情况中,所有情况都是要nums2数组中的元素排完,所以我把n>0作为循环条件。
代码:
1 class Solution { 2 public: 3 void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) { 4 int index=m+n-1;//插入位置的下标 5 while(n>0){ 6 if(nums1[m-1]>nums2[n-1]||m==0){ 7 //第一种和第三种情况和两个数组都未排完的情况 8 if(m!=0) 9 nums1[index--]=nums1[--m]; 10 else 11 //这是两个数组都未排完的情况 12 nums1[index--]=nums2[--n]; 13 } 14 else 15 nums1[index--]=nums2[--n]; 16 } 17 return; 18 } 19 };