题目描述
给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B。 编写一个方法,将 B 合并入 A 并排序。
初始化 A 和 B 的元素数量分别为 m 和 n。
解题思路
方法一:直接合并后排序
最简单的方法是先将数组B放进数组A的尾部,然后直接对整个数组进行排序
代码:
class Solution:
def merge(self, A, m, B, n):
"""
:param A: List[int]
:param m: int
:param B: List[int]
:param n: int
:return: List[int]
"""
A[m:] = B
A.sort()
方法二:双指针
方法1没有利用数组A与数组B已经被排序的性质。
为了利用这一性质,我们可以使用双指针方法。这个方法将两个数组看作队列,每次从两个数组头部取出比较小的数字放到结果中。
我们为两个数组分别设置一个指针pa与pb来作为队列的头部指针。
代码:
class Solution:
def merge(self, A, m, B, n):
"""
:param A: List[int]
:param m: int
:param B: List[int]
:param n: int
:return: List[int]
"""
sorted = []
pa, pb = 0, 0
while pa < m or pb < n:
if pa == m:
sorted.append(B[pb])
pb += 1
elif pb == n:
sorted.append(A[pa])
pa += 1
elif A[pa] < B[pb]:
sorted.append(A[pa])
pa += 1
else:
sorted.append(B[pb])
pb += 1
A[:] = sorted
方法三:逆向双指针
题目描述中表示,A的末端有足够的缓冲空间容纳B,所以我们可以使用idx1和idx2两个指针分别指向A和B的末端,每次将较大的数填充到A的末尾即可。
当A已经填充完毕而B还有剩余时,直接将B的剩余部分填充到A的头部。
代码:
class Solution:
def merge(self, A, m, B, n):
pa, pb = m - 1, n -1
tail = m + n - 1
while pa >= 0 or pb >= 0:
if pa == -1:
A[tail] = B[pb]
pb -= 1
elif pb == -1:
A[tail] = A[pa]
pa -= 1
elif A[pa] > B[pb]:
A[tail] = A[pa]
pa -= 1
else:
A[tail] = B[pb]
pb -= 1
tail -= 1