88. 合并两个有序数组

 

这题可以利用双指针倒排得办法。

我们创建3个指针,分别指向p1,p2分别指向数组1,2得末尾,p3指向数组1得末尾。

从后向前数组遍历nums1,从尾部值开始比较遍历,迭代比较值大小之后,使用较大得元素对nums1[p3]进行填充,
当 p1<0 时遍历结束,此时 nums2 中可能存在数据未拷贝完全(即当p1=0时,p2>0),将其直接填充到 nums1 的前面,最后得到结果数组

时间O(m+n)(需要完整的遍历一遍nums1和nums2),空间O(1)

public void merge(int[] nums1, int m, int[] nums2, int n) {
        int p1 = m-1,p2=n-1,p3=m+n-1;
        while(p2>=0 && p1>=0){
        // 选出较大得值对nums1[p3]进行填充,由后向前递推
if (nums1[p1]>=nums2[p2]){ nums1[p3--]=nums1[p1--]; }else{ nums1[p3--]=nums2[p2--]; } }
// 可能存在当p1=0时,p2>0,因此需要继续填充
while(p2>=0){ nums1[p3--]=nums2[p2--]; } }

 

posted @ 2021-04-06 15:52  jchen104  阅读(72)  评论(0)    收藏  举报