方法:コンテンツBは、残りの空間Aに直接コピーされ、その後、ソートA急速なアプリケーションです。
時間複雑:O(M + N)ログ (M + n)は
次のようにコードがあります。
class Solution:
def merge(self, A, m, B, n):
A[m:] = B
A.sort()
return A
方法2:二重ポインタ
二つのポインタを使用して、新しい配列に2つのサイズ、小さなソートの配列要素の先頭から、二つの配列AおよびBを指している。
コードは以下の通りであります:
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
方法3:(インサイチュ改変、追加の記憶空間における)逆二重ポインタ
配列Aと配列Bのために配置されたポインタA、Bです。配列Aの最後の要素への初期点、すなわちA =配列Bの最後の要素、すなわち、B = N-1までのM-1、Bは、最初のポイント、素子サイズへのポインタ要素及びbポインタを比較し、大きいです要素(すなわち、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