https://leetcode.com/problems/merge-sorted-array/

この問題は pointer を 3つ使う。 1つ目は、nums1 の最後に pointer を設定。 2つ目は、nums1 の m に pointer を設定。 3つ目は、nums2 の 最後に pointer を設定。


| 1 | 2 | 3 | 0 | 0 | 0 |

      ↑           ↑

| 2 | 5 | 6 |

      ↑

nums1[m - 1] と nums2[n - 1] の値を比べて、 nums2[n - 1] の値が大きいので、 nums1[last] = nums2[n - 1] を設定する。 そして nums2 の n の pointer を -1 してずらす。 また nums1 の last の pointer も -1 する。


| 1 | 2 | 3 | 0 | 0 | 6 |

      ↑       ↑

| 2 | 5 | 6 |

  ↑

| 1 | 2 | 3 | 0 | 5 | 6 |

      ↑   ↑

| 2 | 5 | 6 |

↑


| 1 | 2 | 3 | 3 | 5 | 6 |

  ↑   ↑

| 2 | 5 | 6 |

↑


| 1 | 2 | 2 | 3 | 5 | 6 |

  ↑   ↑

| 2 | 5 | 6 |

↑

while を抜ける。

もし nums1 の最初の数(一番小さい数)が nums2 の最初の数より大きい場合、 上記の while 文だと merge されないので、 while n > 0: で nums2 の残りを nums1 に入れる。

class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        """
        Do not return anything, modify nums1 in-place instead.
        """
        # last index nums1
        last = m + n -1

        # merget in reverse order
        while m > 0 and n > 0:
            if nums1[m - 1] > nums2[n - 1]:
                nums1[last] = nums1[m - 1]
                m -= 1
            else:
                nums1[last] = nums2[n - 1]
                n -= 1
            last -= 1

        # fill nums1 with leftover nums2 elements
        while n > 0:
            nums1[last] = nums2[n - 1]
            n, last = n -1, last - 1