【LeetCode 88. 合并两个有序数组】 java实现
LeetCode 88. 合并两个有序数组
题目描述
给你两个有序整数数组 nums1
和 nums2
,请你将 nums2
合并到 nums1
中,使 nums1
成为一个有序数组。
说明:
- 初始化
nums1
和nums2
的元素数量分别为m
和n
。 - 你可以假设
nums1
的大小等于m + n
(即它有足够的空间存放nums2
中的元素)。
示例:
输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
输出: [1,2,2,3,5,6]
Java 实现解法
方法一:双指针从后向前合并
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int p1 = m - 1; // nums1的当前索引
int p2 = n - 1; // nums2的当前索引
int p = m + n - 1; // nums1的末尾索引
while (p1 >= 0 && p2 >= 0) {
if (nums1[p1] > nums2[p2]) {
nums1[p--] = nums1[p1--];
} else {
nums1[p--] = nums2[p2--];
}
}
// 如果nums2还有剩余,直接拷贝到nums1前面
while (p2 >= 0) {
nums1[p--] = nums2[p2--];
}
}
}
解题思路
- 双指针从后向前合并:由于题目要求将
nums2
合并到nums1
中,并且nums1
的空间足够大,因此我们可以使用双指针法从后向前合并这两个数组。这样做的好处是可以避免在合并过程中对nums1
的覆盖,从而丢失尚未处理的数据。 - 在合并过程中,我们比较
nums1
和nums2
的当前元素,将较大的元素放入nums1
的末尾,并更新指针和末尾索引p
。 - 如果
nums2
中还有剩余元素,说明nums1
中的元素已经全部处理完毕,此时我们可以直接将nums2
的剩余元素拷贝到nums1
的前面。
这种方法的时间复杂度是 O(m+n)
,其中 m
和 n
分别是 nums1
和 nums2
的长度,因为每个元素我们至多处理一次。空间复杂度是 O(1)
,因为我们是在原地修改 nums1
。
注:来源leetcode网站