【数组】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 };

浙公网安备 33010602011771号