88 Merge Sorted Array

175 阅读1分钟

合并两个有序数组

所有玩家都全力向前冲刺,却不知道向后才是胜利之门

  1. 双指针
    算法:利用数组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];
        }
}
  1. 逆向双指针
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原地修改,不需要额外空间