java实现两个有序数组合并_java父类引用指向子类对象

java实现两个有序数组合并_java父类引用指向子类对象合并两个有序数组是计算机科学中的一个经典问题 在 Java 中 可以使用多种方法来实现 以下是几种常见的方法 方法一 双指针法 使用双指针法 创建一个新的数组用于存放合并后的结果 并初始化三个指针分别指向两个数组的开头和新数组的开头 比较两个数组当前指针指向的素 将较小的素放入新数组 并将该数组的指针向后移动一位 重复此过程直到一个数组的所有素都被放入新数组

合并两个有序数组是计算机科学中的一个经典问题,在Java中,可以使用多种方法来实现。以下是几种常见的方法:

方法一:双指针法

使用双指针法,创建一个新的数组用于存放合并后的结果,并初始化三个指针分别指向两个数组的开头和新数组的开头。比较两个数组当前指针指向的素,将较小的素放入新数组,并将该数组的指针向后移动一位,重复此过程直到一个数组的所有素都被放入新数组,然后将另一个数组中剩余的素依次放入新数组。

java

public static int[] mergeArrays(int[] arr1, int[] arr2) {

int[] merged = new int[arr1.length + arr2.length];

int i = 0, j = 0, k = 0;

while (i < arr1.length && j < arr2.length) {

if (arr1[i] < arr2[j]) {

merged[k++] = arr1[i++];

} else {

merged[k++] = arr2[j++];

}

}

while (i < arr1.length) {

merged[k++] = arr1[i++];

}

while (j < arr2.length) {

merged[k++] = arr2[j++];

}

return merged;

}

方法二:三指针法

如果数组A的末端有足够的缓冲空间容纳数组B,可以使用三指针法。初始化三个指针,分别指向A、B和合并后数组的末尾。比较A和B当前指针指向的素,将较小的素放入合并后数组的末尾,并将较小素的指针向后移动一位,重复此过程直到B的所有素都被放入合并后数组。

java

public static void merge(int[] nums1, int m, int[] nums2, int n) {

System.arraycopy(nums2, 0, nums1, m, n);

Arrays.sort(nums1, m, m + n);

}

方法三:直接在原数组上合并

如果数组A有足够的空间来保存数组B中的素,可以直接在数组A上进行合并操作,不需要额外的空间。

java

public static void merge(int[] nums1, int m, int[] nums2, int n) {

int p1 = m - 1;

int p2 = n - 1;

int p = m + n - 1;

while (p1 >= 0 && p2 >= 0) {

if (nums1[p1] > nums2[p2]) {

nums1[p--] = nums1[p1--];

} else {

nums1[p--] = nums2[p2--];

}

}

while (p2 >= 0) {

nums1[p--] = nums2[p2--];

}

}

以上方法各有优缺点,选择合适的方法取决于具体的应用场景和性能要求。双指针法通常是最优的,因为它的时间复杂度为O(m+n),其中m和n分别是两个数组的长度。三指针法适用于数组A有足够空间的情况,而直接在原数组上合并则不需要额外的空间,但可能需要对数组进行排序。

请根据您的具体需求选择合适的方法,并尝试实现。

编程小号
上一篇 2026-05-09 13:24
下一篇 2026-05-09 13:21

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://sigusoft.com/bj/44415.html