当前位置: 面试刷题>> 合并排序数组Ⅱ (经典算法题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--;
}
}
```
码小课网站中有更多相关内容分享给大家学习,帮助大家深入理解算法和数据结构。