题目:给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。
我的思路:
用一个循环语句,比较两个数组原序列最后一个数,把较大的放在nums1[ ]的尾部;每次把较大的放在最后,最终得到的就是一个从小到大排列的序列
class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int slow = m+n-1;//指向新序列尾部的指针int fast1 = m-1,fast2 = n-1;//指向两个旧序列尾部的指针//当任何一个序列遍历完结束遍历while(fast1>=0&&fast2>=0){if(nums1[fast1]>nums2[fast2]){nums1[slow--] = nums1[fast1--];}else{nums1[slow--] = nums2[fast2--];}}//将剩下的序列接到新序列头部if(fast1<0){for(int i = fast2;i>=0;i--){nums1[slow--] = nums2[i];}}else{for(int j = fast1;j>=0;j--){nums1[slow--] = nums1[j];}}}
}
一个slow指针,两个fast指针,我是从双指针的思想中想到的,官方答案叫尾插法。
改进的代码:
class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int p = nums1.length-1;int p1 = m-1;int p2 = n-1;while(p1>=0&&p2>=0){nums1[p--] = nums1[p1]>nums2[p2]?nums1[p1--]:nums2[p2--];}while(p1>=0||p2>=0){nums1[p--] = p1>=p2?nums1[p1--]:nums2[p2--];}}
}
if-else语句可以用三目运算符表示,简洁很多