给定两个有序整数数组 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]
思路分析:
标准解法就是双指针法,首先定义两个指针分别指向两个数组的生效部分的尾部,
TL,DL
有序数组问题,因为有序所以用指针

然后指针指向的元素进行比较,取大的元素,把它从 nums1 的末尾开始往前填,同时较大元素的指针也前移,由于 nums1 的有效部分和 nums2 的长度可能不一样,会出现两种指针提前到头的现象:
- num1 有效部分提前到头,意味着 nums1 的头部空出来,nums2 补到前面
nums2 提前到头,不需要任何操作
const merge = function (nums1, nums2) {let m = nums1.length;let n = nums2.length;// 初始化两个指针的指向,初始化 nums1 尾部索引klet 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--;}}// nums2 留下的情况,特殊处理一下while (j >= 0) {nums1[k] = nums2[j];k--;j--;}};
上面使用双指针是各种语言通用的解法,js 中有一种快捷解法,合并数组后直接用 sort 方法排序
const merge = function(nums1, nums2){ return [...nums1, ...nums2].sort((a, b) => a-b) }
