题意:

image.png

解题思路:

  1. 思路:O(m+n)
  2. 1. 设置指针 i j 分别指向 nums1 nums2 的数字尾部,从尾部值开始比较遍历;
  3. 2. 同时设置指针count指向nums1末尾,每次比较大小后进行填充;
  4. 3. 循环以上步骤直到i = 0 j = 0;
  5. 4. i < 0 时,如果还存在nums2中的元素,则将其拷贝到nums1后面;

PHP代码实现:

  1. class Solution {
  2. /**
  3. * @param Integer[] $nums1
  4. * @param Integer $m
  5. * @param Integer[] $nums2
  6. * @param Integer $n
  7. * @return NULL
  8. */
  9. function merge(&$nums1, $m, $nums2, $n) {
  10. $i = $m - 1;
  11. $j = $n - 1;
  12. $count = $m + $n - 1;
  13. while ($i >= 0 && $j >= 0) {
  14. if ($nums1[$i] > $nums2[$j]) {
  15. $nums1[$count--] = $nums1[$i--];
  16. } else {
  17. $nums1[$count--] = $nums2[$j--];
  18. }
  19. }
  20. //i = [2,3] j = [1,4,8]
  21. while ($j >= 0) $nums1[$count--] = $nums2[$j--];
  22. }
  23. }

GO代码实现:

  1. func merge(nums1 []int, m int, nums2 []int, n int) {
  2. i, j, count := m - 1, n - 1, m+n-1
  3. for j >= 0 {
  4. if i >= 0 && nums1[i] > nums2[j] {
  5. nums1[count] = nums1[i]
  6. i--
  7. } else {
  8. nums1[count] = nums2[j]
  9. j--
  10. }
  11. count--
  12. }
  13. }