合并两个有序数组(java解)


湖山客
原创
发布时间: 2025-09-13 16:13:37 | 阅读数 0收藏数 0评论数 0
封面
在日常开发中,我们经常需要将两个已经排好序的数组合并为一个新的有序数组。虽然可以将两个数组直接合并后再排序,但这样效率不高。本文将介绍一种 高效的 Java 解法,利用 双指针和从后向前填充 的策略,原地将两个有序数组合并为一个有序数组,无需额外空间。通过详细示例和代码讲解,读者可以轻松掌握这种在数组处理中非常实用的技巧。
1

题目介绍

给你两个按 非递减顺序 排列的整数数组 nums1 nums2,另有两个整数 mn ,分别表示 nums1nums2 中的元素数目。

请你 合并 nums2 nums1 中,使合并后的数组同样按 非递减顺序 排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n

示例 1:

输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
解释:需要合并 [1,2,3] 和 [2,5,6] 。
合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。

示例 2:

输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]
解释:需要合并 [1] 和 [] 。
合并结果是 [1] 。

示例 3:

输入:nums1 = [0], m = 0, nums2 = [1], n = 1
输出:[1]
解释:需要合并的数组是 [] 和 [1] 。
合并结果是 [1] 。
注意,因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。


2

题目解释

这道题我一开始想了两种解题思路

第一种是 先把两个数组合并 然后按照冒泡排序 但是考虑了一下如果是实际使用场景 那么000不一定在数组末尾


第二种是判断是否为0 然后进行替换和排序操作 但是使用场景中也不一定证明0就是空的数值 所以如果是实际应用应该大家进行判断决定用那种方式

3

方法1

import java.util.Arrays;

class Solution {
/**
* 合并两个有序数组 nums1 和 nums2 到 nums1 中。
* nums1 有足够空间(长度 m+n),其中前 m 个元素是有效数字,nums2 有 n 个元素。
* 最终结果要求 nums1 成为一个有序数组。
*/
public void merge(int[] nums1, int m, int[] nums2, int n) {
// 1. 把 nums2 的所有元素直接放到 nums1 的尾部(从下标 m 开始)
for (int i = 0; i < n; i++) {
nums1[m + i] = nums2[i];
}

// 2. 使用冒泡排序对 nums1 进行整体排序
for (int i = 0; i < nums1.length - 1; i++) {
// 每一轮冒泡,将最大值“冒泡”到末尾
for (int j = 0; j < nums1.length - 1 - i; j++) {
if (nums1[j] > nums1[j + 1]) {
// 交换相邻元素
int temp = nums1[j];
nums1[j] = nums1[j + 1];
nums1[j + 1] = temp;
}
}
}
}
}

4

方法2

class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
// p1 指向 nums1 已有元素的最后一个位置
int p1 = m - 1;
// p2 指向 nums2 的最后一个元素
int p2 = n - 1;
// p 指向 nums1 最终合并后数组的最后一个位置
int p = m + n - 1;

// 从后向前遍历,直到 nums2 中的元素都处理完
while (p2 >= 0) {
// 如果 nums1 还有元素且当前元素大于 nums2 的当前元素
if (p1 >= 0 && nums1[p1] > nums2[p2]) {
// 将 nums1 的当前元素放到 nums1 的末尾
nums1[p--] = nums1[p1--];
} else {
// 否则,将 nums2 的当前元素放到 nums1 的末尾
nums1[p--] = nums2[p2--];
}
}
// 循环结束后,nums1 中已经是合并后的有序数组
}
}

5

完结

如果大家还有什么更好的办法可以打在评论区哦

阅读记录0
点赞0
收藏0
禁止 本文未经作者允许授权,禁止转载
猜你喜欢
评论/提问(已发布 0 条)
评论 评论
收藏 收藏
分享 分享
pdf下载 下载