方法一:把B的内容直接复制到A的剩余空间中,然后再对A应用快速排序。
时间复杂度:O(m+n)log(m+n)
代码如下:
class Solution:
def merge(self, A, m, B, n):
A[m:] = B
A.sort()
return A
方法二:双指针
利用两个指针分别指向两个数组A和B,从头开始比较两个数组的元素大小,小的放到一个新的数组sort中;
代码如下:
class Solution:
def merge(self, A, m, B, n):
a = 0
b = 0
sort = []
while a < m or b < n:
if a == m:
sort.append(B[b])
b += 1
elif b == n:
sort.append(A[a])
a += 1
elif A[a] <= B[b]:
sort.append(A[a])
a += 1
else:
sort.append(B[b])
b += 1
A[:] = sort
return A
方法三:逆向的双指针(原地修改,不需要额外的存储空间)
对于数组A和数组B分别设置指针a, b。a初始指向数组A的最后一个元素,即a=m-1, b初始指向数组B的最后一个元素,即b=n-1; 比较a指针指向的元素和b指针指向的元素大小,大的放到A数组的最有一个一个元素位置(即m+n-1这个位置)。然后依次顺序对元素进行插入操作。
代码如下:
class Solution:
def merge(self, A, m, B, n):
a, b = m - 1, n - 1
tail = m + n - 1
while a >=0 or b >= 0:
if a == -1:
A[tail] = B[b]
b -= 1
# n -= 1
elif b == -1:
A[tail] = A[a]
a -= 1
# m -= 1
elif A[a] <= B[b]:
A[tail] = B[b]
b -= 1
# n -= 1
else:
A[tail] = A[a]
a -= 1
# m -= 1
tail -= 1
return A