Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情
一、题目描述
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组 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 中的元素。
二、解题思路
先看题目要求:
nums1
的数组初始并不是全都是nums1的值,而是为nums2
的元素保留了空间- 本题在遇到nums1和nums2都有的元素时,nums1的元素在前
- 本题没有返回值,最终的结果保留在nums1中
题目要求中nums1刚好为nums2留了位置,我们可以采用双指针法:p1
指针指向nums1的第m个元素,p2
指向nums2的第n个元素,比较之后取较大的元素放到nums1的末尾,然后移动指针;再进行比较,再取值放到nums1末尾,再移动指针……这样不会产生有值被覆盖的问题。
但是还有这样的特殊情况需要我们考虑:
如果nums1中没有真实元素呢?那我们根据指针从两个数组中取值比较时nums1[m-1]
,就会取不到值,因为m的值为0.针对这种情况,我们可以单独设置一个条件判断,当m===0
时,取nums2中的值到nums1中。
如果nums2中没有真实元素呢?nums2[n-1]
也取不到值,这时候我们怎么处理呢?
AC代码
var merge = function(nums1, m, nums2, n) {
// 双指针法
// if (m === 0 || n === 0) {
// // 没有第二个参数,会默认取到末尾
// nums1 = (m === 0) ? nums1.concat(nums2).slice(1) : nums1.concat(nums2)
// }
//初始化两个指针
let p1 = m - 1
let p2 = n - 1
//从nums1的最后一个位置开始
for (let i = m + n - 1; i >= 0; i--) {
if(p1===-1){
//无需比较,直接把nums2中对应的值放到nums1中
nums1[i]=nums2[p2]
p2--
}
else if(p2===-1){
//无需比较,直接把nums1中对应的值拿过来(其实位置没有变,但是是为了避免取不到值)
nums1[i]=nums1[p1]
p1--
}
else if (nums1[p1] >= nums2[p2]) {
nums1[i] = nums1[p1]
p1--
} else if (nums1[p1] < nums2[p2]) {
nums1[i] = nums2[p2]
p2--
}
}
};
复制代码
四、总结
这个题总的来说不难,需要细心、认真。