以下是Java实现合并两个有序数组的代码,添加了便于快速记忆的注释和口诀:
代码实现(带注释)
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]; // 将nums1的较大元素放入末尾
p1--;
} else {
nums1[p] = nums2[p2]; // 将nums2的较大元素放入末尾
p2--;
}
p--; // 合并指针前移
}
// 处理nums2剩余元素(若有)
// nums1剩余元素无需处理,因为它们已经在正确位置
System.arraycopy(nums2, 0, nums1, 0, p2 + 1);
}
记忆口诀
合并有序数组有诀窍,双指针从后往前跑
p1、p2比大小,大的元素往后靠
p1先跑完别担心,nums2剩余直接拷贝
关键点记忆:
- 三指针初始化:
p1指向nums1的有效元素末尾p2指向nums2的末尾p指向合并后数组的末尾
- 比较逻辑:
- 从后向前比较
nums1[p1]和nums2[p2],将较大值放入nums1[p]
- 从后向前比较
- 边界处理:
- 若
nums2有剩余元素,直接复制到nums1头部 nums1的剩余元素无需处理(已在正确位置)
- 若