「双指针」leetcode 88.合并两个有序数组(简单)

451 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

一、了解题目

附上原题链接:88. 合并两个有序数组

给你两个按 非递减顺序 排列的整数数组 nums1nums2,另有两个整数 mn ,分别表示 nums1nums2 中的元素数目。

请你 合并 nums2nums1 中,使合并后的数组同样按 非递减顺序 排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n

示例:

输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
解释:需要合并 [1,2,3] 和 [2,5,6] 。
合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。

碎碎念: 这道题官方标为简单,但我感觉有点中等难度了……

二、题解分析

依据以上题意,我们来看下这道题的解题思路。具体如下:

  • 定义两个指针 p1p2p1 用来控制数组 nums1 的下标, p2 用来控制数组 nums2 的下标;
  • 定义一个数组 sorted ,并将其填充满 0
  • 填充当前值 cur 的四个条件:① p1 指针等于 m 值时;② p2 指针等于 n 值时;③ nums1[p1] < nums2[p2] 时;④其余情况。

三、代码实现

下面我们将用 js 来实现这道题。具体实现代码如下:

/**
 * @param {Array} nums1 
 * @param {Number} m 
 * @param {Array} nums2 
 * @param {Number} n 
 * @returns 
 */

var merge = function(nums1, m, nums2, n) {
    // 1.定义两个指针p1和p2,p1控制m的值(即用来控制nums1数组的下标),p2控制n的值(即用来控制nums2数组的下标)
    let p1 = 0, p2 = 0;
    // 2.将sorted进行初始化数组,并将每个元素都填充上0
    const sorted = new Array(m + n).fill(0);
    // 3.定义一个cur,表示当前值
    let cur;
    // 4.判断条件:p1小于m 或者 p2小于n时
    while (p1 < m || p2 < n) {
        // 4.1 当p1的值等于m时,说明p1已经走到尽头,此时对p2进行+1操作
        if (p1 === m) {
            cur = nums2[p2++];
        } 
        // 4.2 当p2的值等于n时,说明p2已经走到尽头,此时对p1进行+1操作
        else if (p2 === n) {
            cur = nums1[p1++];
        } 
        // 4.3 当p1所对应nums1数组的值 小于 p2所对应nums2数组的值时,则当前值等于nums1[p1],并将p1进行+1操作
        else if (nums1[p1] < nums2[p2]) {
            cur = nums1[p1++];
        } 
        // 其余的情况则,当前值等于nums[p2],并将p2进行+1操作
        else {
            cur = nums2[p2++];
        }
        // 5.一一放进sorted数组中
        sorted[p1 + p2 - 1] = cur;
    }
    // 6.将nums1后面的内容覆盖掉
    for (let i = 0; i != m + n; i++) {
        nums1[i] = sorted[i];
    }
    // 7.返回最终的数组
    return sorted;
};
​
console.log(merge([1,2,3,0,0,0], 3, [2,5,6], 3));

以上就是关于合并两个有序数组的题解,不知道对小伙伴们是否有帮助呢?

我们下期见👋👋👋