88合并两个有序数组
一、题目
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。
**注意:**最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。
示例 1:
1 2 3 4
| 输入:nums1 = , m = 3, nums2 = , n = 3 输出: 解释:需要合并 和 。 合并结果是 ,其中斜体加粗标注的为 nums1 中的元素。
|
示例 2:
1 2 3 4
| 输入:nums1 = , m = 1, nums2 = , n = 0 输出: 解释:需要合并 和 。 合并结果是 。
|
示例 3:
1 2 3 4 5
| 输入:nums1 = , m = 0, nums2 = , n = 1 输出: 解释:需要合并的数组是 和 。 合并结果是 。 注意,因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。
|
提示:
nums1.length == m + n
nums2.length == n
0 <= m, n <= 200
1 <= m + n <= 200
-109 <= nums1[i], nums2[j] <= 109
二、解题
方法一:合并数组法
将nums2合并入nums1中,再将nums1数组进行排序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
var merge = function(nums1, m, nums2, n) { if(!nums2.length){return;} for(i=m;i<nums1.length;i++){ nums1[i]=nums2[i-m]; } nums1.sort((a,b)=>a-b); };
|
方法二:双指针法。
复制一份数组nums1,定义两个指针分别指向nums1和nums2,比较当前两个值的大小,将较小的值复制给新数组,同时指针下标加一。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
|
var merge = function(nums1, m, nums2, n) { if(!nums2.length){return;} var q1=0,q2=0; var i=0; var newNums=new Array(m+n).fill(0); while(q1<m||q2<n){ if(q1==m){ newNums[i]=nums2[q2]; q2++; i++; }else if(q2==n){ newNums[i]=nums1[q1]; q1++; i++; }else if(nums1[q1]<=nums2[q2]){ newNums[i]=nums1[q1]; q1++; i++; }else{ newNums[i]=nums2[q2]; q2++; i++; } } if(q1>=m){ newNums.splice(i,nums1.length-i,...nums2.slice(q2)); } if(q2>=n){ newNums.splice(i,m+n-i,...nums1.slice(q1,m-q1)); } for (let i = 0; i != m + n; i++) { nums1[i] = newNums[i]; } };
|
三、总结
数组的可操作性较为局限,要善用其内置函数库,避免重复”造轮子“。