Leetcode88-合并两个有序数组
Leetcode88-合并两个有序数组
给你两个有序整数数组nums1和nums2,请你将nums2合并到nums1中,使nums1成为一个有序数组。初始化nums1和nums2的元素数量分别为m和n 。你可以假设nums1的空间大小等于m + n,这样它就有足够的空间保存来自nums2的元素。
本题的思路:通过两个指针逐个比较nums1和nums2的各个元素,将更小的元素先存放到保存结果的数组中,并移动指向该元素的指针使其指向下一个元素,而另一个指针保持不变。如果两个指针指向的元素相等,则将这两个相等的元素存放到结果数组中,并同时移动这两个指针。这里要注意的是最后会有一个数组中存在未比较完的元素,因此需要将这些元素逐个存放到保存结果的数组中。
1 // Leetcode 88 2 // Array, two pointers 3 var merge = function(nums1, m, nums2, n) { 4 res = []; 5 if (m == 0 && n == 0) { 6 return res; 7 } 8 9 if (m == 0 && n > 0) { 10 for (let i = 0; i < n; i++) { 11 nums1[i] = nums2[i]; 12 } 13 return nums1; 14 } 15 16 if (m != 0 && n == 0) { 17 return nums1; 18 } 19 20 PointerM = 0; PointerN = 0; 21 while (PointerM != m && PointerN != n) { 22 if(nums1[PointerM] > nums2[PointerN]) { 23 res.push(nums2[PointerN]); 24 PointerN++; 25 } else if (nums1[PointerM] < nums2[PointerN]) { 26 res.push(nums1[PointerM]); 27 PointerM++; 28 } else { 29 res.push(nums1[PointerM]); 30 res.push(nums2[PointerN]); 31 PointerM++; 32 PointerN++; 33 } 34 } 35 36 if (PointerM >= m) { 37 for (let i = PointerN; i < n; i++) { 38 res.push(nums2[i]); 39 } 40 } 41 42 if (PointerN >= n) { 43 for (let i = PointerM; i < m; i++) { 44 res.push(nums1[i]); 45 } 46 } 47 48 for (let i = 0; i < res.length; i++) { 49 nums1[i] = res[i]; 50 } 51 52 return res; 53 }; 54 55 nums1 = [1,2,3,0,0,0]; m = 3; nums2 = [2,5,6]; n = 3; 56 res = merge(nums1, m, nums2, n); 57 console.log(res); //1,2,2,3,5,6

浙公网安备 33010602011771号