文章目录

  • Merge Sorted Array 合并两个有序数组
    • 问题描述:
    • 分析
    • 代码
      • Sort
    • Tag

Merge Sorted Array 合并两个有序数组

问题描述:

给你两个按 非递减顺序 排列的整数数组 nums1nums2,另有两个整数 mn ,分别表示 nums1nums2 中的元素数目。

请你 合并 nums2nums1 中,使合并后的数组同样按 非递减顺序 排列。

**注意:**最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n

n u m s 1. l e n g t h = = m + n n u m s 2. l e n g t h = = n 0 < = m , n < = 200 1 < = m + n < = 200 − 1 09< = n u m s 1 [ i ] , n u m s 2 [ j ] < = 1 09 nums1.length == m + n\\ nums2.length == n\\ 0 <= m, n <= 200\\ 1 <= m + n <= 200\\ -10^9 <= nums1[i], nums2[j] <= 10^9nums1.length==m+nnums2.length==n0<=m,n<=2001<=m+n<=200109<=nums1[i],nums2[j]<=109

分析

常见的处理方式,就不赘述了。

先说结论,从尾部进行双指针。

n u m s 1nums1nums1长度为 m + nm+nm+n, n u m 2num2num2长度为 nnn,但是 n u m s 1nums1nums1中只有前m个是有效的数据。
所以定义3个指针,

  • p1 表示nums1中最后一个数字
  • p2 表示nums2中最后一个数字。
  • p = m+n-1,表示nums1中可以放入数字的位置。

整个过程可以看成是一个逆向的归并
注意指针的移动,别越界,当一个指针小于0时,就可以单独处理另一个指针。

代码

Sort

public void merge(int[] nums1, int m, int[] nums2, int n) {int p1 = m-1,p2 = n-1,idx = m+n-1;while( idx>=0 ){if(p1>=0&&p2>=0){if(nums2[p2]>=nums1[p1]){nums1[idx--] = nums2[p2--];}else{nums1[idx--] = nums1[p1--];}}else if(p1>=0){nums1[idx--] = nums1[p1--];}else{nums1[idx--] = nums2[p2--];}}return;}

时间复杂度O(M+N)O(M+N) O(M+N)

空间复杂度O(1)O(1) O(1)

Tag

Array

Sort

Two Pointers