给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
说明:
初始化 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]
解法:
双指针 / 从前往后
将指针 i 置为 nums1的开头, j 为 nums2的开头,在每一步将最小值放入输出数组中,最后判断剩余的值进行合并
PHP
class Solution {
/**
* @param Integer[] $nums1
* @param Integer $m
* @param Integer[] $nums2
* @param Integer $n
* @return NULL
*/
function merge(&$nums1, $m, $nums2, $n) {
$tmp = $nums1;
$i = 0;
$j = 0;
$p = 0;
while ($i < $m && $j < $n) {
if ($tmp[$i] <= $nums2[$j]) {
$nums1[$p] = $tmp[$i];
$i++;
} else {
$nums1[$p] = $nums2[$j];
$j++;
}
$p++;
}
if ($i < $m) {
$nums1 = array_merge(array_slice($nums1, 0, $p), array_slice($tmp, $i, $m - $i));
}
if ($j < $n) {
$nums1 = array_merge(array_slice($nums1, 0, $p), array_slice($nums2, $j));
}
}
}
GO
func merge(nums1 []int, m int, nums2 []int, n int) {
tmp := make([]int, m)
copy(tmp, nums1)
i := 0
j := 0
p := 0
for {
if i >= m || j >= n {
break;
}
if tmp[i] <= nums2[j] {
nums1[p] = tmp[i]
i++
} else {
nums1[p] = nums2[j]
j++
}
p++
}
if i < m {
nums1 = append(nums1[:p], tmp[i:]...)
}
if j < n {
nums1 = append(nums1[:p], nums2[j:]...)
}
}
双指针 / 从后往前
从末尾开始排序,不需要使用额外空间
PHP
class Solution {
/**
* @param Integer[] $nums1
* @param Integer $m
* @param Integer[] $nums2
* @param Integer $n
* @return NULL
*/
function merge(&$nums1, $m, $nums2, $n)
{
$i = $m - 1;
$j = $n - 1;
$p = $m + $n - 1;
while ($i >= 0 && $j >= 0) {
if ($nums1[$i] >= $nums2[$j]) {
$nums1[$p] = $nums1[$i];
$i--;
} else {
$nums1[$p] = $nums2[$j];
$j--;
}
$p--;
}
$nums1 = array_merge(array_slice($nums2, 0, $j + 1), array_slice($nums1, $j + 1));
}
}
GO
func merge(nums1 []int, m int, nums2 []int, n int) {
i := m - 1
j := n - 1
p := m + n - 1
for {
if i < 0 || j < 0 {
break;
}
if nums1[i] >= nums2[j] {
nums1[p] = nums1[i]
i--
} else {
nums1[p] = nums2[j]
j--
}
p--
}
for t := 0; t <= j; t++ {
nums1[t] = nums2[t]
}
}