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


题目描述

合并排序数组Ⅱ(Merge Sorted Arrays II)

给定两个已排序的整数数组 nums1mmnums1 的大小(即 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 代码示例

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 代码示例

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 代码示例

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--;
    }
}

码小课网站中有更多相关内容分享给大家学习,帮助大家深入理解算法和数据结构。

推荐面试题