题目链接

合并两个有序数组

题目描述

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

说明:

  • 初始化 nums1nums2 的元素数量分别为 m 和 n 。
  • 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。

    解题思路

    1. 从后向前原地合并

本题保证了 nums1 有足够的空间来保存 nums2 中的元素,所以可以直接原地合并。

  1. class Solution {
  2. public void merge(int[] nums1, int m, int[] nums2, int n) {
  3. int tail = m + n - 1;
  4. int t1 = m - 1;
  5. int t2 = n - 1;
  6. while (t1 >= 0 && t2 >= 0) {
  7. if (nums1[t1] > nums2[t2]) {
  8. nums1[tail--] = nums1[t1--];
  9. } else {
  10. nums1[tail--] = nums2[t2--];
  11. }
  12. }
  13. while (t2 >= 0) {
  14. nums1[tail--] = nums2[t2--];
  15. }
  16. }
  17. }
  • 时间复杂度5.1 合并两个有序数组 - 图1
  • 空间复杂度5.1 合并两个有序数组 - 图2