###### tags: `Leetcode` `easy` `pointer` `python` `c++` # 88. Merge Sorted Array ## [題目出處:] https://leetcode.com/problems/merge-sorted-array/ ## 題目: You are given two integer arrays nums1 and nums2, sorted in non-decreasing order, and two integers m and n, representing the number of elements in nums1 and nums2 respectively. **Merge nums1 and nums2 into a single array sorted in non-decreasing order.** The final sorted array should not be returned by the function, but instead be stored inside the array nums1. To accommodate this, nums1 has a length of m + n, where the first m elements denote the elements that should be merged, and the last n elements are set to 0 and should be ignored. nums2 has a length of n. ## 解題想法: * 此題為排序組合nums1、nums2於nums1中 * nums1長度為m+n,後面n格全都是0 -> 設兩pointer逐一比較nums1、nums2尾巴 -> pointer tail為len(nums)-1 -> 大的放入nums[tail] ## Python: ``` python= class Solution(object): def merge(self, nums1, m, nums2, n): """ :type nums1: List[int] :type m: int :type nums2: List[int] :type n: int :rtype: None Do not return anything, modify nums1 in-place instead. """ #runs in O(m + n) for i in range(1, m + n + 1): if n == 0: #nums2沒東西ㄌ print("case1") break elif m == 0: #nums1沒東西ㄌ #負數 往回數 -1 最後一個 -2 倒數第二個 print('case2') #將nums2最後一值 塞到nums1最後面 nums1[-i] = nums2[n-1] n = n- 1 continue #不能用break!!! ex: nums1= [0,0] nums=[1,2] #continue會跳過本次迴圈剩下的程式碼,但不會結束迴圈,仍然會進入下一圈繼續執行 if nums1[m - 1] < nums2[n - 1]: #若nums2最後一個的值 比nums1的值大 #!!! nums1最後值要用 m-1 不能用-i 因為-i裝的是0 print('case3') nums1[-i] = nums2[n - 1] n = n- 1 else: print('case4') #把nums1的值 丟到最後一個位置 nums1[-i] = nums1[m - 1] m = m- 1 return nums1 class Solution2(object): def merge(self, nums1, m, nums2, n): """ :type nums1: List[int] :type m: int :type nums2: List[int] :type n: int :rtype: None Do not return anything, modify nums1 in-place instead. """ p1=m-1 p2=n-1 tail=m+n-1 while p1>=0 and p2>=0: if nums1[p1]<=nums2[p2]: nums1[tail]=nums2[p2] tail-=1 p2-=1 else: nums1[tail]=nums1[p1] tail-=1 p1-=1 #nums2還有剩 while p2>=0: nums1[tail]=nums2[p2] tail-=1 p2-=1 if __name__ == '__main__': nums1 = [1,2,3,0,0,0] m = 3 nums2 = [2,5,6] n = 3 result = Solution() ans = result.merge(nums1,m,nums2,n) print(ans) ``` ## C++: ``` cpp= #include<iostream> #include<vector> using namespace std; class Solution{ public: void merge(vector<int>& nums1, int m, vector<int>& nums2, int n){ int p1=m-1; int p2=n-1; int tail=m+n-1; while (p1>=0 && p2>=0){ if (nums1[p1]<=nums2[p2]){ nums1[tail]=nums2[p2]; tail-=1; p2-=1; } else{ nums1[tail]=nums1[p1]; tail-=1; p1-=1; } } while (p2>=0){ nums1[tail]=nums2[p2]; tail-=1; p2-=1; } } }; int main(){ vector<int>nums1={1,2,3,0,0,0}; vector<int>nums2={2,5,6}; int m=3; int n=3; Solution res; res.merge(nums1,m,nums2,n); for (int i=0; i<nums1.size(); i++){ cout<<nums1[i]<<" "; } return 0; } ```