LeetCode 面试题 10.01. 合并排序的数组
题目描述
思路分析
解法一:从后向前合并(推荐)
核心思路:
A数组末尾预留空间,可从后往前填充。- 使用三指针
i、j、k分别指向A有效末尾、B末尾、合并末尾。- 每次选择较大元素放到
A[k],避免覆盖未处理的A。
复杂度分析:
- 时间复杂度:O(m + n),其中 m、n 分别为两个数组的有效长度。
- 空间复杂度:O(1),原地合并。
class Solution {
public void merge(int[] A, int m, int[] B, int n) {
int i = m - 1;
int j = n - 1;
int k = m + n - 1;
while (i >= 0 && j >= 0) {
if (A[i] > B[j]) {
A[k] = A[i];
i--;
} else {
A[k] = B[j];
j--;
}
k--;
}
while (j >= 0) {
A[k] = B[j];
j--;
k--;
}
}
}
func merge(A []int, m int, B []int, n int) {
i := m - 1
j := n - 1
k := m + n - 1
for i >= 0 && j >= 0 {
if A[i] > B[j] {
A[k] = A[i]
i--
} else {
A[k] = B[j]
j--
}
k--
}
for j >= 0 {
A[k] = B[j]
j--
k--
}
}
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 88. 合并两个有序数组 | 简单 | 双指针 |
| 21. 合并两个有序链表 | 简单 | 链表 |
| 977. 有序数组的平方 | 简单 | 双指针 |
| 986. 区间列表的交集 | 中等 | 双指针 |
| 23. 合并 K 个升序链表 | 困难 | 分治/堆 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!
