两有序数组合并

这篇博客讲解了如何使用C++实现合并两个有序整数数组的方法,通过nums1[]和nums2[]的合并操作,保持合并后数组的有序性。重点介绍了merge()函数的工作原理和步骤,适合初学者理解数组合并的基本算法技巧。

题目描述
给出两个有序的整数数组 和 ,请将数组 合并到数组 中,变成一个有序的数组
注意:
可以假设 数组有足够的空间存放 数组的元素, 和 中初始的元素数目分别为 和

void merge(int nums1[], int m, int nums2[], int n) 
{
	//两个数组都从最后一个元素进行比较,根据比较结果赋值给num1尾部(两数组相加后的长度)
	int i = m - 1, j = n - 1, index = m + n - 1;
	while (i >= 0 && j >= 0)
		nums1[index--] = nums1[i] > nums2[j] ? nums1[i--] : nums2[j--];
	
}
### 合并两个序数组的解决方案 以下是通过 Python 和 Java 实现将两个序数组合为一个新的升序数组的具体方法。 #### 方法概述 为了高效地完成这一任务,可以采用双指针法。这种方法利用了两个数组已经排序的特点,从头到尾依次比较数组中的元素按顺序放入新的目标数组中。此过程的时间复杂度为 O(m+n),其中 m 和 n 是两个数组的长度[^4]。 --- #### Python 实现代码 下面是一个基于 Python 的实现: ```python def merge_sorted_arrays(nums1, nums2): merged = [] i, j = 0, 0 # 双指针遍历两个数组 while i < len(nums1) and j < len(nums2): if nums1[i] <= nums2[j]: merged.append(nums1[i]) i += 1 else: merged.append(nums2[j]) j += 1 # 如果其中一个数组还有剩余元素,则直接追加到结果列表后面 while i < len(nums1): merged.append(nums1[i]) i += 1 while j < len(nums2): merged.append(nums2[j]) j += 1 return merged # 测试用例 nums1 = [1, 3, 11, 20, 22] nums2 = [55, 444, 555, 800, 9999, 10000, 22222] result = merge_sorted_arrays(nums1, nums2) print(result) # 输出应为:[1, 3, 11, 20, 22, 55, 444, 555, 800, 9999, 10000, 22222] ``` 上述代码展示了如何使用双指针技术来逐步构建一个新数组 `merged`,该数组包含了来自 `nums1` 和 `nums2` 中的所有元素保持其升序排列。 --- #### Java 实现代码 下面是基于 Java 的实现方式: ```java public class MergeSortedArrays { public static int[] merge(int[] nums1, int m, int[] nums2, int n) { int[] result = new int[m + n]; int i = 0, j = 0, k = 0; // 使用双指针分别指向两个数组的起始位置 while (i < m && j < n) { if (nums1[i] <= nums2[j]) { result[k++] = nums1[i++]; } else { result[k++] = nums2[j++]; } } // 将剩余部分复制到结果数组中 while (i < m) { result[k++] = nums1[i++]; } while (j < n) { result[k++] = nums2[j++]; } return result; } public static void main(String[] args) { int[] nums1 = {1, 3, 11, 20, 22}; int m = nums1.length; int[] nums2 = {55, 444, 555, 800, 9999, 10000, 22222}; int n = nums2.length; int[] mergedArray = merge(nums1, m, nums2, n); System.out.println(Arrays.toString(mergedArray)); // 输出应为:[1, 3, 11, 20, 22, 55, 444, 555, 800, 9999, 10000, 22222] } } ``` 这段代码实现了类似的逻辑,在处理过程中创建了一个额外的结果数组用于存储合并后的数据[^3]。 --- #### 结果验证 对于给定的例子 `[1, 3, 11, 20, 22]` 和 `[55, 444, 555, 800, 9999, 10000, 22222]`,最终得到的合并数组应该是: \[ [1, 3, 11, 20, 22, 55, 444, 555, 800, 9999, 10000, 22222] \][^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值