image.png

解题思路

双指针 / 从前往后

image.png

  1. class Solution {
  2. public void merge(int[] nums1, int m, int[] nums2, int n) {
  3. // Make a copy of nums1.
  4. int [] nums1_copy = new int[m];
  5. System.arraycopy(nums1, 0, nums1_copy, 0, m);
  6. // Two get pointers for nums1_copy and nums2.
  7. int p1 = 0;
  8. int p2 = 0;
  9. // Set pointer for nums1
  10. int p = 0;
  11. // Compare elements from nums1_copy and nums2
  12. // and add the smallest one into nums1.
  13. while ((p1 < m) && (p2 < n))
  14. nums1[p++] = (nums1_copy[p1] < nums2[p2]) ? nums1_copy[p1++] : nums2[p2++];
  15. // if there are still elements to add
  16. if (p1 < m)
  17. System.arraycopy(nums1_copy, p1, nums1, p1 + p2, m + n - p1 - p2);
  18. if (p2 < n)
  19. System.arraycopy(nums2, p2, nums1, p1 + p2, m + n - p1 - p2);
  20. }
  21. }
  • 时间复杂度 : O(n + m)。
  • 空间复杂度 : O(m)。

    双指针/ 从后往前

    image.png
  1. class Solution {
  2. public void merge(int[] nums1, int m, int[] nums2, int n) {
  3. // two get pointers for nums1 and nums2
  4. int p1 = m - 1;
  5. int p2 = n - 1;
  6. // set pointer for nums1
  7. int p = m + n - 1;
  8. // while there are still elements to compare
  9. while ((p1 >= 0) && (p2 >= 0))
  10. // compare two elements from nums1 and nums2
  11. // and add the largest one in nums1
  12. nums1[p--] = (nums1[p1] < nums2[p2]) ? nums2[p2--] : nums1[p1--];
  13. // add missing elements from nums2
  14. System.arraycopy(nums2, 0, nums1, 0, p2 + 1);
  15. }
  16. }

复杂度分析

  • 时间复杂度 : O(n + m)。
  • 空间复杂度 : O(1)。