领扣(LeetCode)合并两个有序数组 个人题解
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
说明:
- 初始化 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]
这道题,第一想法是动态插入,但是种种错误导致了失败,特别是没有考虑到当nums1遍历完了后,nums2剩下的元素怎么处理。循环不太好写。
参考了代码,发现了还是空间换复杂度的做法。新建立一个数组存放两个数组的当前最小值,存放完了索引加1,继续寻找两个数组中的最小值。这样做下去,直到nums1遍历完或者nums2遍历完。
这时候,假设nums1没遍历完,那么nums2肯定遍历完了,就把nums1的值塞到尾部。如果nums2没遍历完,那么nums1肯定遍历完了,把nums2塞到尾部。这里可以根据当前位置的索引来判断。
参考的链接(他的题解不够详细):https://blog.csdn.net/qq_38595487/article/details/79935382
代码如下:
1 class Solution { 2 public void merge(int[] nums1, int m, int[] nums2, int n) { 3 int[] newnums=new int[m+n]; 4 int index=0; 5 int i=0,j=0; 6 while(i<m && j<n) 7 { 8 if(nums1[i]<nums2[j]) 9 newnums[index++]=nums1[i++]; 10 else 11 newnums[index++]=nums2[j++]; 12 } 13 while(i<m) 14 newnums[index++]=nums1[i++]; 15 while(j<n) 16 newnums[index++]=nums2[j++]; 17 System.arraycopy(newnums,0,nums1,0,newnums.length); 18 19 } 20 }