返回

将两个已排序数组合并为一个排序数组:轻松掌握LeetCode 88 合并两个有序数组题

闲谈

  1. 问题概述

LeetCode 88 题的题目如下:

给定两个有序整数数组 nums1nums2,将 nums2 合并到 nums1 中,使其成为一个有序数组。

nums1 中的元素数量为 mnums2 中的元素数量为 n。请确保 nums1 中有足够的空余空间来容纳 nums2 中的元素。

示例 1:

输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]

示例 2:

输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]

提示:

  • 0 <= m, n <= 200
  • 1 <= m + n <= 200
  • -10^9 <= nums1[i], nums2[j] <= 10^9

2. 解题思路

解题思路一:

  1. 首先,我们需要创建一个新的数组 nums3,它的大小是 m + n
  2. 然后,我们使用两个指针 ij 分别指向 nums1nums2 的首元素。
  3. 接着,我们将较小的元素添加到 nums3 中,并更新指针 ij
  4. 重复步骤 3,直到 nums1nums2 中的所有元素都添加到 nums3 中。
  5. 最后,我们将 nums3 复制到 nums1 中,并返回 nums1

解题思路二:

  1. 首先,我们将 nums2 中的所有元素添加到 nums1 的末尾。
  2. 然后,我们将 nums1 排序。
  3. 最后,我们将 nums1 返回。

3. 实现方法

方法一:

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int[] nums3 = new int[m + n];
        int i = 0, j = 0, k = 0;

        while (i < m && j < n) {
            if (nums1[i] < nums2[j]) {
                nums3[k++] = nums1[i++];
            } else {
                nums3[k++] = nums2[j++];
            }
        }

        while (i < m) {
            nums3[k++] = nums1[i++];
        }

        while (j < n) {
            nums3[k++] = nums2[j++];
        }

        for (int l = 0; l < m + n; l++) {
            nums1[l] = nums3[l];
        }
    }
}

方法二:

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        System.arraycopy(nums2, 0, nums1, m, n);
        Arrays.sort(nums1);
    }
}

4. 总结

LeetCode 88 题是 LeetCode 中一道经典的算法题,它考察了算法的排序能力和数组操作能力。这道题目的解法有很多种,上面给出的两种解法都是比较简单的。读者可以根据自己的喜好选择一种解法进行练习。

5. 延伸思考

  1. 如果 nums1nums2 都是升序的,那么我们是否可以使用更有效率的算法来合并这两个数组呢?
  2. 如果 nums1 的空间不够容纳 nums2 中的所有元素,那么我们应该如何处理呢?
  3. 如果 nums1nums2 都非常大,以至于无法在内存中容纳,那么我们应该如何合并这两个数组呢?