1. 概述

两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。

说明:

初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。

你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。

示例:

输入:

nums1 = [1,2,3,0,0,0], m = 3

nums2 = [2,5,6], n = 3

输出:[1,2,2,3,5,6]

提示:

  • -10^9 <= nums1[i], nums2[i] <= 10^9

  • nums1.length == m + n

  • nums2.length == n

2. 解题

  1. <?php
  2. class Solution
  3. {
  4. /**
  5. * @param Integer[] $nums1
  6. * @param Integer $m
  7. * @param Integer[] $nums2
  8. * @param Integer $n
  9. * @return NULL
  10. */
  11. public function merge(&$nums1, $m, $nums2, $n)
  12. {
  13. $newM = $m;
  14. $newJ = 0;
  15. for ($i = 0; $i < $m; $i++) {
  16. for ($j = $newJ; $j < $n; $j++) {
  17. if ($nums1[$i] >= $nums2[$j]) {
  18. $newJ = $j + 1;
  19. $newM++;
  20. $this->moveRightOne($nums1, $i);
  21. $nums1[$i] = $nums2[$j];
  22. } else {
  23. break;
  24. }
  25. }
  26. }
  27. if ($newJ <= $n) {
  28. for ($k = $newJ; $k <= $n; $k++) {
  29. if (!isset($nums2[$k])) break;
  30. $nums1[$newM++] = $nums2[$k];
  31. }
  32. }
  33. return;
  34. }
  35. // $nums1 从下标 $startIndex 开始逐个遍历向右移动一格
  36. private function moveRightOne(&$nums1, $startIndex)
  37. {
  38. for ($i = count($nums1) - 2; $i >= $startIndex; $i--) {
  39. $nums1[$i + 1] = $nums1[$i];
  40. }
  41. $nums1[$startIndex] = 0;
  42. }
  43. }
  44. $nums1 = [1, 2, 3, 0, 0, 0];
  45. $m = 3;
  46. $nums2 = [2, 5, 6];
  47. $n = 3;
  48. $cls = new Solution();
  49. $ret = $cls->merge($nums1, $m, $nums2, $n);
  50. print_r($nums1);