1、解题思路
- 合并两个有序数组 :由于数组 A 和 B 都是有序的,可以利用双指针的方法,分别从数组 A 和 B 的末尾开始比较,将较大的元素放到数组 A 的末尾。
- 处理剩余元素 :如果数组 B 还有剩余元素,直接将其复制到数组 A 的前面。如果数组 A 还有剩余元素,由于数组 A 本身是有序的,不需要额外处理。
2、代码实现
C++
class Solution {
public:
void merge(int A[], int m, int B[], int n) {
int i = m - 1; // 数组 A 的末尾指针
int j = n - 1; // 数组 B 的末尾指针
int k = m + n - 1; // 合并后的数组末尾指针
while (i >= 0 && j >= 0) {
if (A[i] > B[j]) {
A[k--] = A[i--];
} else {
A[k--] = B[j--];
}
}
// 如果数组 B 还有剩余元素, 直接复制到 A 前面
while (j >= 0) {
A[k--] = B[j--];
}
}
};
Java
import java.util.*;
public class Solution {
public void merge(int A[], int m, int B[], int n) {
int i = m - 1; // 数组 A 的末尾指针
int j = n - 1; // 数组 B 的末尾指针
int k = m + n - 1; // 合并后的数组末尾指针
while (i >= 0 && j >= 0) {
if (A[i] > B[j]) {
A[k--] = A[i--];
} else {
A[k--] = B[j--];
}
}
// 如果数组 B 还有剩余元素,直接复制到 A 的前面
while (j >= 0) {
A[k--] = B[j--];
}
}
}
Python
#
#
# @param A int整型一维数组
# @param B int整型一维数组
# @return void
#
class Solution:
def merge(self , A, m, B, n):
# write code here
i = m - 1 # 数组 A 的末尾指针
j = n - 1 # 数组 B 的末尾指针
k = m + n - 1 # 合并后的数组末尾指针
while i >= 0 and j >= 0:
if A[i] > B[j]:
A[k] = A[i]
i -= 1
else:
A[k] = B[j]
j -= 1
k -= 1
# 如果数组 B 还有剩余元素,直接复制到 A 的前面
while j >= 0:
A[k] = B[j]
j -= 1
k -= 1
3、复杂度分析
- 时间复杂度:O(m + n),其中 m 和 n 分别是数组 A 和 B 的长度。每个元素最多被处理一次。
- 空间复杂度:O(1),只使用了常数级别的额外空间。