问题描述:
给定两个有序整数数组 A 和 B,将B合并到A中,使得 A 成为一个有序数组。
说明:
- 初始化 A 和 B 的元素数量分别为 m 和 n。
- A有足够的空间(空间大小大于或等于 m + n)来保存 B 中的元素。
- 默认升序。
输入输出描述:
步骤:1、创建两个数组A、B分别读取输入流数据,其中A数组的大小应该设置为A、B两数组长度之和,因为A数组最后存放的是合并后的数据。
2、设置三个变量i,j,k分别指向A、B数组,以及合并后的数组的末尾,从末尾开始一个个遍历A、B数组中的元素,若A大于B,则把A数组中的元素放到A的最后位置,反之则把B数组位置放到A数组最后位置,最后遍历完之后,若B数组还剩余元素,则把数组再添加到A数组中。
代码:
import java.util.*;
public class MergeTwoLists {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 从标准输入读取数组A的元素数量和数组A的元素
int m = scanner.nextInt();
int n = scanner.nextInt();
int[] A = new int[m+n];
int[] B = new int[n];
for (int i = 0; i < m; i++) {
A[i] = scanner.nextInt();
}
// 从标准输入读取数组B的元素数量和数组B的元素
for (int i = 0; i < n; i++) {
B[i] = scanner.nextInt();
}
merge(A, m, B, n);
// 输出合并后的数组A到标准输出
for (int num : A) {
System.out.print(num + " ");
}
}
public static 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; // 指向合并后的数组A的末尾
while (i >= 0 && j >= 0) {
if (A[i] > B[j]) {
A[k] = A[i];
i--;
} else {
A[k] = B[j];
j--;
}
k--;
}
// 如果数组B中还有剩余元素,将其复制到数组A中
while (j >= 0) {
A[k] = B[j];
j--;
k--;
}
}
}