合并两个有序数组
所有玩家都全力向前冲刺,却不知道向后才是胜利之门
- 双指针
算法:利用数组nums1和nums2已经被排序的性质,利用双指针,将两个数组看成队列,每次取出两个队列头部元素进行比较,并将小的元素放到结果中。
复杂度分析
- 时间复杂度:O(m+n) 指针移动单调递增,最多移动m+n次
- 空间复杂度:O(m+n) 需要建立长度为m+n的中间数组sorted
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
int p1=0,p2=0;
int sorted[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++];
}
sorted[p1+p2-1]=cur;
}
for(int i=0;i<m+n;i++){
nums1[i]=sorted[i];
}
}
- 逆向双指针
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, 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;
}
}
复杂度分析
- 时间复杂度:O(m+n) 指针移动单调递增,最多移动m+n次
- 空间复杂度:O(1) 直接对数组nums1原地修改,不需要额外空间