题目:
给定两个有序整数数组nums1 和 nums2, nums2 合并到 nums1 中, 使得 nums1 成为一个有序数组。
刚拿到题时,首先想到的是从前向后依次比较大小,逐个将nums2中的数值加入到nums1中,但实际写起来发现非常麻烦,每进行一次插入数值后都要把nums1中的所有大于nums2中某数值的数往后移动一位。
因此,采用从后向前的方式将nums2中数值插入。由于两组都是有序数组,所以只需要依次比较两个数组“最后一位”的大小关系,放置完后向前移动一位。
文字有点繁琐,下面用画图来描述大概过程:
创建数组:
比较最后一位大小:
向前遍历:
代码示例:
package Homework;
import java.util.Arrays;
public class test05 {
public static void main(String[] args) {
int[] arr1 = new int[10];
int[] arr2 = new int[6];
arr1[0] = 1;arr1[1] = 3;arr1[2] = 6;arr1[3] = 8;
arr2[0] = 2;arr2[1] = 2;arr2[2] = 3;arr2[3] = 4;arr2[4] = 7;arr2[5] = 11;
merge(arr1,4,arr2,6);
System.out.println(Arrays.toString(arr1));
}
public static void merge(int[] nums1, int m, int[] nums2, int n){
int i = m - 1;
int j = n - 1;
int len = m + n - 1;
if ( n == 0 ){ // 如果nums2为空时,返回nums1
return ;
}
if ( m == 0 ){ // 如果nums1为空时,将nums2中所有元素放入nums1中
nums1[len--] = nums2[j--];
}
while ( i >= 0 && j >= 0){
if (nums1[i] < nums2[j]){ //从后往前进行比较
nums1[len] = nums2[j];
len--;
j--;
}else {
nums1[len] = nums1[i];
len--;
i--;
}
}
while ( j >= 0 ){
nums1[len] = nums2[j];
len--;
j--;
}
while ( i >= 0 ){
nums1[len] = nums1[i];
len--;
i--;
}
}
}
结果: