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++;
}
}
}
}