ai提供的耳目一新的思路,今天分享一下
思路
A、B两数组,从后往前遍历两个数组:设置三个指针,两个分别指两个数组有数据的尾节点,另一个指向A的物理存储最后一个节点(A中至少有len(A+B)的空间)分别比较两个指针所指的尾节点数据,由大到小排列,从第三个指针的位置开始填充数据,直到覆盖到A中第一位。
代码
void mergeSortedArrays(int A[], int m, int B[], int n) {
// 初始化三个指针
int indexA = m - 1; // 指向A中最后一个有效元素
int indexB = n - 1; // 指向B中最后一个有效元素
int indexMerged = m + n - 1; // 指向合并后的数组最后一个位置
// 从后向前遍历,将较大的元素放到合并数组的末尾
while (indexA >= 0 && indexB >= 0) {
if (A[indexA] > B[indexB]) {
A[indexMerged] = A[indexA];
--indexA;
} else {
A[indexMerged] = B[indexB];
--indexB;
}
--indexMerged;
}
// 如果B还有剩余元素,则将其复制到A中
while (indexB >= 0) {
A[indexMerged] = B[indexB];
--indexB;
--indexMerged;
}
// 如果A还有剩余元素,则不需要做任何事情,因为它们已经在正确的位置上
}
int main() {
int A[] = {1, 3, 5, 0, 0, 0}; // 假设最后的0是为B预留的空间
int B[] = {2, 4, 6};
int m = 3; // A的有效长度
int n = 3; // B的长度
mergeSortedArrays(A, m, B, n);
// 打印合并后的数组
for (int i = 0; i < m + n; ++i) {
printf("%d ", A[i]);
}
printf("\n");
return 0;
}