---
# System prepended metadata

title: 0088. Merge Sorted Array
tags: [Leetcode, FaceBook, Easy]

---

#  0088. Merge Sorted Array
###### tags: `Leetcode` `Easy` `FaceBook`
Link: https://leetcode.com/problems/merge-sorted-array/
## 思路
### 思路一 $O(m+n)$ $O(1)$
很tricky的一道题
一开始的想法是一个一个比较 然后从最左边开始 但这样就可能会覆盖到还没排列的数据
因此 看了答案之后 发现更好的做法是**用三个pointer，从后往前填数字**
两个阵列从最尾端开始 谁比较大 谁放进nums1里面，直到nums2里面的数据都放完了，nums1也不需要再处理了，因为剩下的部分也已经排好顺序了
**总结下来就是 跟数字相关的题想想倒着来（例如之前移到rotate array的题 把array翻转一下就解了）**
### 思路二
后来做题的时候想到的，类似双指针的做法，（一个指针指向下一个即将被排序的数字应该放在nums1的哪里，一个指向nums2的第一个数字）一个一个比较，如果nums1里面的数字比较小，那么指向nums1的指针往右移一个，如果nums2里面的数字比较小，就把这个数字跟nums1里面的数字调换位置，然后把nums2排序，保证nums2永远是从小到大排的，一直比到nums1没有数字了（因为nums1里面永远只会有m个数字，那么就把nums2的数字全部接在后面）
## Code
### 思路一
Java
```java=
class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int p1 = m-1;
        int p2 = n-1;
        for(int p = m+n-1;p >= 0;p--){
            if(p2<0) break;
            if(p1>=0 && nums1[p1]>nums2[p2]){
                nums1[p] = nums1[p1];
                p1--;
            }
            else{
                nums1[p] = nums2[p2];
                p2--;
            }
        }

    }
}
```
C++
```c=
class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        if(n == 0){
            return;
        }
        if(m == 0){
            for(int i = 0;i < n;i++){
                nums1[i] = nums2[i];
            }
        }
        int pos = m+n-1;
        m-=1;
        n-=1;
        while(n>=0){
            if(m>=0 && nums1[m]>nums2[n]){
                nums1[pos] = nums1[m];
                pos--;
                m--;
            }
            else{
                nums1[pos] = nums2[n];
                pos--;
                n--;
            }
        }
    }
};
```
### 思路二
```java=
int i = 0, temp;
        while(i!=m){
            if(nums1[i]>nums2[0]){
                temp = nums1[i];
                nums1[i] = nums2[0];
                nums2[0] = temp;
                i++;
                Arrays.sort(nums2);
            }
            else{
                i++;
            }
        }
        for(int j = m;j < nums1.length;j++){
            nums1[j] = nums2[j-m];
        }
```
## Result
### 思路一
Runtime: 0 ms, faster than **100.00%** of C++ online submissions for Merge Sorted Array.
Memory Usage: 9.1 MB, less than **60.10%** of C++ online submissions for Merge Sorted Array.
### 思路二
Your runtime beats **93.30 %** of java submissions.
Your memory usage beats **99.77 %** of java submissions.
