题目描述:
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。
示例 1:
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
示例 2:
输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]
提示:
nums1.length == m + n
nums2.length == n
0 <= m, n <= 200
1 <= m + n <= 200
-109 <= nums1[i], nums2[i] <= 109
直觉解法:
设置双指针,分别指向nums1与nums2,当均不为空时,比较指向值的大小,选择小的一个放进temp数组中,并指针与temp数组的mark++,如果两者相等,则一起放入,并移动两个指针
最后将不为空的nums1或者nums2剩下的数放temp后,然后temp值赋给nums1。
1 class Solution { 2 public void merge(int[] nums1, int m, int[] nums2, int n) { 3 int i = 0; 4 int j = 0; 5 int []temp = new int[nums1.length]; 6 int mark = 0; 7 //两个数组均不为空 8 while (i<m && j<n){ 9 int flag = nums1[i] - nums2[j]; 10 if (flag>0){ 11 flag = 1; 12 }else if (flag<0){ 13 flag = -1; 14 }else { 15 flag = 0; 16 } 17 switch (flag){ 18 case 0: 19 temp[mark] = nums1[i]; 20 temp[mark+1] = nums2[j]; 21 22 if (mark<nums1.length){ 23 i++; 24 j++; 25 mark+=2; 26 } 27 break; 28 case 1: 29 temp[mark] = nums2[j]; 30 if (mark<nums1.length){ 31 mark++; 32 j++; 33 } 34 break; 35 case -1: 36 temp[mark] = nums1[i]; 37 if (mark<nums1.length){ 38 i++; 39 mark++; 40 } 41 break; 42 } 43 44 } 45 while (i<m){ 46 temp[mark] = nums1[i]; 47 i++; 48 mark++; 49 } 50 51 while (j<n){ 52 temp[mark] = nums2[j]; 53 j++; 54 mark++; 55 } 56 for(int l = 0 ;l<nums1.length;l++){ 57 nums1[l] = temp[l]; 58 } 59 } 60 }
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
原文:https://www.cnblogs.com/charler/p/14609764.html