【Leetcode】88. 合并两个有序数组

124 阅读1分钟

题目描述

在这里插入图片描述

// 88. 合并两个有序数组


// 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1
// 成为一个有序数组。

// 初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小
// 等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。

题解

// 双指针法
// 还记得归并排序的merge函数吗,i和j双指针遍历各自元素,谁元素小谁就
// 放入temp[index]中,然后相应指针右移,index也右移。
// 这里的双指针法需要反过来,双指针从右往左移动,谁大谁的元素就放入,
// 谁就可以指针左移。
// 
// 定义nums1遍历指针i,初始化为m-1,需要从m-1遍历到0,
// 定义nums2遍历指针j,初始化为n-1,需要从n-1遍历到0,
// 定义nums1答案元素遍历指针index,初始化为n+m-1,需要从n+m-1遍历到0,
// 定义while,终止条件为当i和j都遍历完成,然后进行条件判断:
// 保证i j不越界前提下,如果nums1[i]>=nums2[j]那么nums1[i]放入nums1[index],
// 指针i和index左移,
// 保证i j不越界前提下,如果nums1[i]<nums2[j]那么nums2[j]放入nums1[index],
// 指针j和index左移。
// 如果nums2提前遍历完了,则有j < 0,那么直接让nums1[i]放入nums1[index],
// 指针i和index左移,
// 如果nums1提前遍历完了,则有i < 0,那么直接让nums2[j]放入nums1[index],
// 指针j和index左移。
// 直到nums1和nums1遍历完了,那么nums1的重排也就完成了。
// 
// 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
// 内存消耗:38.5 MB, 在所有 Java 提交中击败了60.01%的用户
class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
		int i = m - 1;
		int j = n - 1;
		int index = m + n - 1;
		while (i >= 0 || j >= 0) {
			if (i >= 0 && j >= 0 && nums1[i] >= nums2[j]) 
				nums1[index--] = nums1[i--];
			else if (i >= 0 && j >= 0 && nums1[i] < nums2[j]) 
				nums1[index--] = nums2[j--];
			else if (i >= 0 && j < 0)
				nums1[index--] = nums1[i--];
			else if (i < 0 && j >= 0)
				nums1[index--] = nums2[j--];
		}
    }
}