【数组 双指针】lc88. 合并两个有序数组 不使用额外空间巧解

思路非常的巧妙。需求是合并两个数组并且放在第一个数组中。

解法:为了减少不必要的挪动,先从后向前去判断谁大,谁大谁先放进去,不仅不需要判断第一个数组是否遍历完了(因为把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 --];
        }
    }
}

Guess you like

Origin blog.csdn.net/AlexanderRon/article/details/121582480