Java习题:合并两个有序数组
文章目录
- 前言
- 一、题目描述
- 二、方法
- 2.1 方法一
- 2.2 方法二
前言
虽然这个题目很简单,但是在使用java语言实现的过程中,存在多种方法这是很有意思的一道题,所以小编在这里写下它的各种方法加深javase语法的学习。
提示:以下是本篇文章正文内容,下面案例可供参考
一、题目描述
题目链接:合并两个有序数组
这是一道来自leetcode上的题目,比较基础也比较简单,下面为该题目的描述:
二、方法
2.1 方法一
这也是小编之前的思路,因为nums1的数组长度为两个数组长度的和,但是nums1本身存储的数组长度的元素个数为m个,nums2的数组长度为n,此时将两个数组直接拼接到一起然后在对整个数组进行排序。
图解
在这里直接将nums2中数组的数据拼接到nums1后面,然后使用java中Arrays中的方法sort对整个数组进行排序,如果如果后面碰到题目不允许用数组方法,那么可以自己写一个冒泡排序方法。
代码
class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int j = 0;for(int i = m;i < m+n;i++) {nums1[i] = nums2[j];j++;}Arrays.sort(nums1);}
}
2.2 方法二
采用双指针法,对于两个数组都分别给定一个指针指向第一个元素,因为这两个数组都是有序序列,所以每次比较大小之后,把小的先放上去,然后再放剩下的。那么就会存在以下情况
class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int[] num = Arrays.copyOf(nums1,m); //拷贝字符串的内容int i = 0;int j = 0;int x = 0;//在这里进入循环,循环结束的条件是其中一个数组遍历结束while(i < m && j < n) {//里面也需要判断,因为有可能一个数组中所有的元素大于另外一个数组,导致遍历直接结束。//第一个数组中的元素大于第二个数组中的元素if(i < m && j < n &&nums2[j] <= num[i]) {nums1[x] = nums2[j];x++;j++;}//第二个数组中的元素大于第一个数组中的元素if(i < m && j < n && num[i] < nums2[j]) {nums1[x] = num[i];x++;i++;}}//这里是第一个数组遍历结束的情况,此时把第二个数组全部加到nums1的后面if(i == m) {while(x < m+n) {nums1[x] = nums2[j];x++;j++;}}//这里是第二个数组遍历结束的情况,此时把第二个数组全部加到nums1的后面if(j == n) {while(x < m+n) {nums1[x] = num[i];x++;i++;}}}
}