一、前言:
这是怀化学院的:Java数据结构中的一道难度中等偏下的一道编程题(此方法为博主自己研究,问题基本解决,若有bug欢迎下方评论提出意见,我会第一时间改进代码,谢谢!) 后面其他编程题只要我写完,并成功实现,会陆续更新,记得三连哈哈! 所有答案供参考,不是标准答案,是博主自己研究的写法。
二、题目要求如下:(注意输入的也是两个非递减线性表,也就是递增线性表)
(第 14 题) 合并线性表(难度系数65)
合并线性表
描述:已知两非递减的顺序线性表,要求合并成一个新的非递减顺序线性表。
输入:输入包含四行,第一行为自然数n,表示第一个非递减顺序线性表的长度,第二行为n个自然数构成的非递减顺序线性表,第三行为自然数m,表示第二个非递减顺序线性表的长度,第四行为m个自然数构成的非递减顺序线性表。
输出:用一行输出合并后的非递减顺序线性表,各数之间用一个空格隔开。
样例输入:
2
1 3
3
2 3 6
样例输出:
1 2 3 3 6
三、代码实现:(基本原理在代码注释中)
(1)我自己创建了一个线性表类:因为我用的是顺序表实现线性表,则用到了数组。它的顺序存储结构可以用一组地址连续的存储单元依次存储线性表的数据元素,还有数组的元素类型使用泛型的话,可以实现不同数据类型的线性表。
package com.fs.list;
import java.util.Scanner;
public class Linear_List {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//此题用的其实是顺序表实现线性表,那就会用到数组
int n=sc.nextInt(); //第一组非递减线性表的长度
int data1[]=new int[n];
for(int i=0;i<n;i++){
data1[i]=sc.nextInt();
}
//第二组非递减线性表的长度
int m=sc.nextInt();
int data2[]=new int[m];
for(int j=0;j<m;j++){
data2[j]=sc.nextInt();
}
//创建新的数组,来存放合并线性表后的数据
int sum=n+m;
int []data=new int[sum];
int i=0; //第一个数组的下标
int j=0; //第二个数组的下标
int k=0; //合并后数组的下标
for(;k<sum;k++) {
if(i < n && j < m){ //为了满足两个数组里的数的下标都在各自数组存在
//注意每次赋完值后 i或j 都要自增1,表示这个小标已经赋值完了,到下一个了
if (data1[i] < data2[j]) {
data[k] = data1[i++]; //把两个数组的第一个数中最小的赋值给:合并后的数组的第一个数
} else if (data1[i] > data2[j]) {
data[k] = data2[j++]; //把两个数组的第一个数中最小的赋值给:合并后的数组的第一个数
} else if ((data1[i] == data2[j])) {
data[k++] = data1[i++]; //这里我设定如果当两个数组的值相等时,就优先将第一个顺序线性表的数据赋值给合并后的数组,再将第二个顺序线性表的数据赋值
data[k] = data2[j++];
}
}
else if(j==m&&i<n){ //此地方的作用就是:当某一个数组的值赋值完毕后,就将剩余没赋值完的数组的值继续赋值给合并后的数组
data[k]=data1[i++];
}else if(i==n&&j<m){
data[k]=data2[j++];
}
}
//顺序输出存储合并后的线性表的数据的数组里的值
for(int x=0;x<sum;x++){
System.out.print(data[x]+" ");
}
}
}
四、不同情况下的代码运行结果:
<1>首先测试输入题目中输入样例:
<2> 测试输入题目输入样例反过来:
<3> 其它测试输入: