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