思路非常的巧妙。需求是合并两个数组并且放在第一个数组中。
解法:为了减少不必要的挪动,先从后向前去判断谁大,谁大谁先放进去,不仅不需要判断第一个数组是否遍历完了(因为把nums2遍历完的情况就是nums1中剩下的元素都比nums2[0]小),而且不需要使用额外的内存空间。
但要是需要该方法返回一个数组的情况下,还是需要使用传统方法从前向后遍历的。具体情况因题而异。
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
// 初始化p结点到nums1数组(已扩容)的最后一位
int p = m -- + n -- - 1;
// 当数组1还有值未遍历到 且 数组2也没遍历到
while(m >= 0 && n >= 0) {
// 经典谁大谁先进 指针前移
nums1[p --] = nums1[m] > nums2[n] ? nums1[m --] : nums2[n --];
}
// 为什么只需要判断数组2 因为数组1已经是有序且最小的了 如果没遍历完也不需要管了
while(n >= 0) {
nums1[p --] = nums2[n --];
}
}
}