88. 合并两个有序数组

Problem: 88. 合并两个有序数组

Reference

https://leetcode.cn/problems/merge-sorted-array/solutions/666608/he-bing-liang-ge-you-xu-shu-zu-by-leetco-rrb0/?envType=study-plan-v2&envId=top-interview-150

思路

这个图片可以解释一大半,用一个数组存取结果。

将两个数组当作队列看待,不断从队列中选取小的元素。

一个队列取完了就只取另外一个。

复杂度

时间复杂度:

添加时间复杂度, 示例: $O(n)$

空间复杂度:

添加空间复杂度, 示例: $O(n)$

Code

[]
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
42
43
44
45
46
47
48
49

class Solution {

public:

    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {

        int p1 = 0,p2 = 0;

        int sorted[m + n];

        int cur = 0; // 从nums1和nums2取得的最大元素

        while (p1 < m || p2 < n) {

            if (p1 == m) { // nums1到头了

                cur = nums2[p2++];

            } else if (p2 == n) { // nums2到头了

                cur = nums1[p1++];

            } else if (nums1[p1] < nums2[p2]) {

                cur = nums1[p1++];

            } else {

                cur = nums2[p2++];

            }

            sorted[p1 + p2 - 1] = cur;

        }

        // 将sorted放入nums1

        for (int i = 0; i != m + n; ++i) {

            nums1[i] = sorted[i];

        }

    }

};