0
点赞
收藏
分享

微信扫一扫

【LeetCode 88】合并两个有序数组


题目描述

给你两个有序整数数组 ​​nums1​​​ 和 ​​nums2​​​,请你将 ​​nums2​​​ 合并到 ​​nums1​​​ 中,使 ​​nums1​​ 成为一个有序数组。

说明:

  • 初始化​​nums1​​​ 和​​nums2​​ 的元素数量分别为 m 和 n 。
  • 你可以假设​​nums1​​​ 有足够的空间(空间大小大于或等于 m + n)来保存​​nums2​​ 中的元素。

示例:

输入:
nums1 = [1,2,3], m = 3
nums2 = [2,5,6], n = 3

输出: [1,2,2,3,5,6]

解题思路

首先看到这个题目,我们应该能想到使用双指针来解决这个问题。

  • 首先把两个指针分别指向两个数组生效部分的尾部
  • 每次两个指针所指向的值进行对比,将较大的值放在nums1的后面,并往前填补

这就是实现该题的步骤,但是我们还需要考虑一个问题,就是我们不确定是哪个数组先遍历完,这会对最后的几个产生影响,那就只有两种情况:

  • nums1先执行完,那就意味着nums1的头部空出来了,直接把nums2放在nums1前面即可
  • nums2先执行完,那本身就是再往nums1中填值所以就不用管了,得到的就是最终的结果

代码实现

/**
* @param {number[]} nums1
* @param {number} m
* @param {number[]} nums2
* @param {number} n
* @return {void} Do not return anything, modify nums1 in-place instead.
*/
var merge = function(nums1, m, nums2, n) {
//初始化指针:i指向nums1的结尾,j指向nums2的结尾,k指向合并后的最后一位
let i =m-1, j = n-1, k = m+n-1;
while(i>=0 && j>=0){
if(nums1[i]>=nums2[j]){
nums1[k] = nums1[i]
i--
k--
}else{
nums1[k]=nums2[j]
j--
k--
}
}
// 处理nums1先执行完的情况
while(j>=0){
nums1[k] = nums2[j]
j--
k--
}
};

提交结果

(很惊讶,内存消耗竟然超过了100%的用户~)

【LeetCode 88】合并两个有序数组_数据结构


举报

相关推荐

0 条评论