简介
题目链接:https://leetcode.cn/problems/merge-sorted-array/description/
解决方式:数组 + 双指针
这是作者学习众多大神的思路进行解题的步骤,很推荐大家解题的时候去看看题解里面大佬们的思路、想法!
推荐查看灵茶山艾府大佬所作题解。
双指针
解题思路:双指针。不过与以往不同的是,此处双指针是倒序遍历数组。因为根据题目可知,数组是非严格递增的,最后一个元素是该数组最大的元素。我们从后往前遍历,可以很好的利用到 nums1 数组后面空出来的空间,而且移动元素都是有效操作。如果我们从前往后遍历,会出现每次都需要移动后面元素的情况,很多无效的移动操作,不如从后往前遍历高效。
java
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
// p1 指向 nums1 最后有效元素,p2 指向 nums2 最后元素,p 指向 nums1 最后元素
int p1 = m - 1;
int p2 = n - 1;
int p = m + n - 1;
// 一直迭代,直到 nums2 中的所有元素合并到 nums1
while(p2 >= 0){
// 如果 p1 元素大于 p2,则 p1 元素移到 nums1 数组的最后,反之亦然
if(p1 >= 0 && nums1[p1] > nums2[p2]){
// 有可能出现 p1 的元素都比 p2 小,所以需要判断 p1 >= 0
nums1[p--] = nums1[p1--];
}else{
nums1[p--] = nums2[p2--];
}
}
}
}