文章目录
- 题目描述
- 法一 双指针
- 法二 逆向双指针
题目描述
法一 双指针
使用双指针方法,将两个数组看作队列,每次从两个数组头部取出比较小的数字放到结果中。
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;
}
}
};