原题请见:LeetCode88 合并两个有序数组
1、题目描述
2、题目分析
关键点1:两个数组是非递减顺序
关键点2:nums2
合并进 nums1
,意思是最好不用额外空间实现
关键点3:nums1
的长度是 (nums2长度
+ nums1长度
)
因为两数组是有序的,所以可以从两个数组的最左边(或者最右边),陆续比较哪个数组的边界元素更小(或更大)依次取出来扫到目标数组即可。
但考虑到本题目是在nums1
数组上原地排序,如果从左往右比较,会导致新元素插入nums1
的时候, nums1
原来的元素需要依次右移,复杂度较高。
又考虑到 nums1
数组的右边 n
个元素都是空白的,所以从右往左比较,不会导致元素顺移问题。
3、题解
class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {// 最终目标数组的索引int idx = m + n - 1;int idx1 = m - 1;int idx2 = n - 1;// 依次取出来 nums1和nums2当前最大的,放在目标数组最右边while (idx1 >= 0 && idx2 >= 0) {if (nums1[idx1] >= nums2[idx2]) {nums1[idx--] = nums1[idx1--];} else {nums1[idx--] = nums2[idx2--];}}// 哪个数组还剩的话,说明这块整体小于另一个数组,剩下的直接陆续往左排while (idx1 >= 0) {nums1[idx--] = nums1[idx1--];}while (idx2 >= 0) {nums1[idx--] = nums2[idx2--];}}
}