文章目录
- 题目描述
- 法一 双指针
- 法二 逆向双指针
题目描述
法一 双指针
使用双指针方法,将两个数组看作队列,每次从两个数组头部取出比较小的数字放到结果中。
void merge(vector<int>&nums1, int m,vector<int>&nums2, int n){int p1=0, p2=0;int sort[m+n];int cur;while(p1<m || p2<n){if(p1==m){cur=nums2[p2++]; } else if(p2==n){cur=nums1[p1++];} else if(nums1[p1]<nums2[p2]){cur=nums1[p1++];} else {cur=nums2[p2++];}sort[p1+p2-1]=cur;}for(int i=0;i!=m+n;i++){nums1[i]=sort[i];}}
法二 逆向双指针
nums1的后半部分是空的,可以直接覆盖而不会影响结果。因此可以指针设置为从后向前遍历,每次取两者之中的较大者放进 nums1 的最后面。
class Solution{
public:void merge(vector<int>&nums1, int m,vector<int>&nums2, int n){int p1=m-1, p2=n-1;int tail = m+n-1;int cur;while(p1>=0 || p2>=0){if(p1==-1){cur=nums2[p2--];} else if(p2==-1){cur=nums1[p1--];} else if(nums1[p1] > nums2[p2]){cur=nums1[p1--];} else {cur=nums2[p2--];}nums1[tail--]=cur;}}
};