class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
for(int i = 0;i < nums2.size();i++){
nums1[m+i] = nums2[i];//把num2的数据放在num1后面
}
sort(nums1.begin(),nums1.end());//排序
}
};
方法二:双指针
算法
方法一没有利用数组nums 1与 nums 2已经被排序的性质。为了利用这一性质,我们可以使用双指针方法。这一方法将两个数组看作队列,每次从两个数组头部取出比较小的数字放到结果中。
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int p1 = 0,p2 = 0;//我们为两个数组分别设置一个指针p1和p2来作为队列的头部指针。代码实现如下:
int sorted[m+n];//定义数组
int cur;//存放最小的数字
while(p1<m ||p2<n){
if(p1 == m){//nums1全部取完,后面只取nums2
cur = nums2[p2++];
}else if(p2 == n){///nums2全部取完,后面只取nums1
cur = nums1[p1++];
}else if(nums1[p1]<nums2[p2]){//nums1的头结点值更小
cur = nums1[p1++];
}else if(nums1[p1]>=nums2[p2]){
cur = nums2[p2++];
}
sorted[p1+p2-1] = cur;//把取出的最小值付给sorted数组
}
for(int i = 0;i < m+n;i++){
nums1[i] = sorted[i];//sorted数组的值赋给nums1
}
}
};