当前位置: 面试刷题>> 合并排序数组Ⅱ (经典算法题500道)


### 题目描述 合并排序数组Ⅱ(Merge Sorted Arrays II) 给定两个已排序的整数数组 `nums1` 和 `m`,`m` 是 `nums1` 的大小(即 `nums1` 中有效元素的数量,`nums1` 的其余部分将被忽略),以及一个整数数组 `nums2`,大小为 `n`。 请编写一个函数,将 `nums2` 中的所有元素合并到 `nums1` 中,`nums1` 的大小增长到 `m+n`,并且确保合并后的 `nums1` 仍然是有序的。注意,你只能在 `nums1` 上原地修改,并且不能使用额外的数组。 **示例 1**: ``` 输入: nums1 = [1,2,3,0,0,0], m = 3 nums2 = [2,5,6] 输出: [1,2,2,3,5,6] 解释: 需要合并 [1,2,3] 和 [2,5,6] 。 注意,因为 m = 3,所以 nums1 只包含 [1,2,3] 这三个元素。 我们需要将 nums2 的元素合并到 nums1 中。 ``` **示例 2**: ``` 输入: nums1 = [1], m = 1 nums2 = [] 输出: [1] 解释: 需要合并 [1] 和 [] , 因为没有元素需要合并,所以 nums1 不变。 ``` **示例 3**: ``` 输入: nums1 = [0], m = 0 nums2 = [1] 输出: [1] 解释: 需要合并的数组 nums1 是空的, 所以我们只需要把 nums2 中的元素放入 nums1。 ``` ### PHP 代码示例 ```php function mergeSortedArray(&$nums1, $m, $nums2, $n) { $tail = $m + $n - 1; // 指向 nums1 的最后一个位置 $m--; // nums1 的当前有效元素索引 $n--; // nums2 的当前索引 while ($m >= 0 && $n >= 0) { if ($nums1[$m] > $nums2[$n]) { $nums1[$tail] = $nums1[$m]; $m--; } else { $nums1[$tail] = $nums2[$n]; $n--; } $tail--; } // 如果 nums2 还有剩余元素,直接追加到 nums1 的前面 while ($n >= 0) { $nums1[$tail] = $nums2[$n]; $n--; $tail--; } } ``` ### Python 代码示例 ```python def mergeSortedArray(nums1, m, nums2, n): tail = m + n - 1 m -= 1 n -= 1 while m >= 0 and n >= 0: if nums1[m] > nums2[n]: nums1[tail] = nums1[m] m -= 1 else: nums1[tail] = nums2[n] n -= 1 tail -= 1 # 如果 nums2 还有剩余元素,直接追加到 nums1 的前面 nums1[:n+1] = nums2[:n+1] ``` ### JavaScript 代码示例 ```javascript function mergeSortedArray(nums1, m, nums2, n) { let tail = m + n - 1; let mIdx = m - 1; let nIdx = n - 1; while (mIdx >= 0 && nIdx >= 0) { if (nums1[mIdx] > nums2[nIdx]) { nums1[tail] = nums1[mIdx]; mIdx--; } else { nums1[tail] = nums2[nIdx]; nIdx--; } tail--; } // 如果 nums2 还有剩余元素,直接追加到 nums1 的前面 while (nIdx >= 0) { nums1[tail] = nums2[nIdx]; nIdx--; tail--; } } ``` 码小课网站中有更多相关内容分享给大家学习,帮助大家深入理解算法和数据结构。
推荐面试题