【数组】88. 合并两个有序数组

题目:

 

 

解答:

从后向前进行数据遍历。

(1)因为nums1的空间都集中在后面,所以从后向前处理排序的数据会更好,节省空间,一边遍历一边将值填充进去;

(2)设置指针len1和len2,分别指向nums1和nums2的有数字尾部,从尾部值开始比较遍历,同时设置指针len指向nums1的最末尾,每次遍历比较值大小之后,则进行填充;

(3)当len1<0时遍历结束,此时num2中还有数据未拷贝完成,将其直接拷贝到nums1前面,最好得到结果数组。

 1 class Solution {
 2 public:
 3     void merge(vector<int>& nums1, int m, vector<int>& nums2, int n)
 4     {
 5         int len1 = m - 1;
 6         int len2 = n - 1;
 7         int len = m + n - 1;
 8 
 9         while(len1 >= 0 && len2 >= 0)
10         {
11             // 注意--符号在后面,表示先进行计算再减1,这种缩写缩短了代码
12             nums1[len--] = nums1[len1] > nums2[len2] ? nums1[len1--] : nums2[len2--];
13         }
14 
15         // 最后一个while循环是考虑到 当原数组nums1中元素排序完 但数组nums2中元素未被合并完 出现的情况
16         while(len2 >=0)
17         {
18             nums1[len--] = nums2[len2--]; 
19         }
20     }
21 };

 

posted @ 2020-05-04 16:15  梦醒潇湘  阅读(204)  评论(0)    收藏  举报