代码:就是合并
class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { int []tmp=new int[m+n];//申请一个新的数组,用来存放临时的数 int i=0;//临时 int index1=0,index2=0;//第一个、第二个数组移动的下标表示 while(index1<m&&index2<n){//最重要 if(nums1[index1]<=nums2[index2]){ tmp[i]=nums1[index1]; index1++; }else{ tmp[i]=nums2[index2]; index2++; } i++;//下标移动 } //如果没有存放完,接着执行,下面两个只会执行一个 for(int j=index1;j<m;j++){ tmp[i++]=nums1[j]; } for(int j=index2;j<n;j++){ tmp[i++]=nums2[j]; } //赋值回原来的数组中 for(i=0;i<m+n;i++){ nums1[i]=tmp[i]; } } }看一下大佬的解法--三种。。。。。无语了
class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { System.arraycopy(nums2, 0, nums1, m, n); Arrays.sort(nums1); } } //我的也是这种思路,他的真简洁 class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { // Make a copy of nums1. int [] nums1_copy = new int[m]; System.arraycopy(nums1, 0, nums1_copy, 0, m); // Two get pointers for nums1_copy and nums2. int p1 = 0; int p2 = 0; // Set pointer for nums1 int p = 0; // Compare elements from nums1_copy and nums2 // and add the smallest one into nums1. while ((p1 < m) && (p2 < n)) nums1[p++] = (nums1_copy[p1] < nums2[p2]) ? nums1_copy[p1++] : nums2[p2++]; // if there are still elements to add if (p1 < m) System.arraycopy(nums1_copy, p1, nums1, p1 + p2, m + n - p1 - p2); if (p2 < n) System.arraycopy(nums2, p2, nums1, p1 + p2, m + n - p1 - p2); } } class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { // two get pointers for nums1 and nums2 int p1 = m - 1; int p2 = n - 1; // set pointer for nums1 int p = m + n - 1; // while there are still elements to compare while ((p1 >= 0) && (p2 >= 0)) // compare two elements from nums1 and nums2 // and add the largest one in nums1 nums1[p--] = (nums1[p1] < nums2[p2]) ? nums2[p2--] : nums1[p1--]; // add missing elements from nums2 System.arraycopy(nums2, 0, nums1, 0, p2 + 1); } }