这题可以利用双指针倒排得办法。
我们创建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--]; } }