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
posted @ 2021-04-09 16:50  曹冲字仓舒  阅读(59)  评论(0)    收藏  举报