【都还有一些不完美的地方,比如说代码重复性较高的问题,待改正】
目录
一、线性表的合并
1.问题描述
2.算法步骤
①算法
②时间复杂度
3.代码实现
import java.util.Scanner;
//线性表的合并
public class listUnion {
public int size;//定义固定表的初始大小
public int[] La ;
public int[] Lb ;
Scanner in = new Scanner(System.in);
int La_len= in.nextInt();//输入La要存入的元素个数,即表长
int Lb_len= in.nextInt();//输入Lb要存入的元素个数,即表长
public listUnion() {
this(100);
}
public listUnion(int size) {//初始化线性表
La = new int[size];
Lb = new int[size];
for(int j=0;j<La_len;j++) {
La[j]=-1;
}
for(int i=0;i<Lb_len;i++) {
Lb[i]=-1;
}
}
public void addNode() {
Scanner on = new Scanner(System.in);
System.out.print("La表的元素有:");
for(int j=0;j<La_len;j++) {
La[j]=on.nextInt();
System.out.print(La[j]+" ");
}
System.out.print("\r");
System.out.print("Lb表的元素有:");
for(int i=0;i<Lb_len;i++) {
Lb[i]=on.nextInt();
System.out.print(Lb[i]+" ");
}
System.out.print("\r");
}
public void addAll() {//将La,Lb合并成Lc
for(int k=0;k<Lb_len;k++) {
int e = Lb[k];
for(int t=0;t<La_len;t++) {
if(e!=La[t]) {
if(t==La_len-1) {
La_len++;
La[La_len-1]=e;
break;
}
}else {
break;
}
}
}
for(int j=0;j<La_len;j++) {
System.out.print(La[j]+" ");
}
}
public static void main(String[] args) {
listUnion L = new listUnion();
L.addNode();
System.out.print("合并后:");
L.addAll();
}
}
4.结果输出
二、有序表的合并
1.问题描述
2.算法步骤
①算法
②时间复杂度
③空间复杂度
3.代码实现
import java.util.Scanner;
//顺序表的合并
public class Union {
public int size;//定义固定表的初始大小
public int[] La ;
public int[] Lb ;
public int[] Lc ;
Scanner in = new Scanner(System.in);
int La_len= in.nextInt();//输入La要存入的元素个数,即表长
int Lb_len= in.nextInt();//输入Lb要存入的元素个数,即表长
int Lc_len = La_len+Lb_len;
public Union() {
this(100);
}
public Union(int size) {//初始化线性表
La = new int[size];
Lb = new int[size];
Lc = new int[size*2];
for(int j=0;j<La_len;j++) {
La[j]=-1;
}
for(int i=0;i<Lb_len;i++) {
Lb[i]=-1;
}
for(int i=0;i<Lc_len;i++) {
Lc[i]=-1;
}
}
public void addNode() {
Scanner on = new Scanner(System.in);
System.out.print("La表的元素有:");
for(int j=0;j<La_len;j++) {
La[j]=on.nextInt();
}
System.out.print("\r");
System.out.print("Lb表的元素有:");
for(int i=0;i<Lb_len;i++) {
Lb[i]=on.nextInt();
}
System.out.print("\r");
}
public void addAll() {//将La,Lb合并成Lc
int i=0;
int j=0;
int k=0;
while((i<=La_len-1)&&(j<=Lb_len-1)) {
int pa=La[i];
int pb=Lb[j];
if(pa<pb) {
Lc[k]=pa;
k++;
i++;
}
else if(pa>pb) {
Lc[k]=pb;
k++;
j++;
}
else {
Lc[k]=pa;
Lc[k+1]=pb;
k+=2;
i++;
j++;
}
}
while(i==La_len) {//La到表尾
for(int p=j;p<Lb_len;p++) {
Lc[k]=Lb[p];
k++;
}
break;
}
while(j==Lb_len) {//Lb到表尾
for(int q=i;q<La_len-1;q++) {
Lc[k]=Lb[q];
k++;
}
break;
}
for(int t=0;t<Lc_len;t++) {
System.out.print(Lc[t]+" ");
}
}
public static void main(String[] args) {
Union L = new Union();
L.addNode();
System.out.print("合并后:");
L.addAll();
}
}
4.结果输出
三、有序表的合并--用链表实现
1.算法步骤
①算法图示过程
②算法
③时间复杂度
④空间复杂度
算法的空间复杂度是:O(1)
2.代码实现
//有序链表的合并
public class lnodeUnion {
//单链表初始化
public int data;
public lnodeUnion next = null;
lnodeUnion head = null;//作为头结点
//无参构造函数
public lnodeUnion() {}
//带参构造函数
public lnodeUnion(int data) {
this.data = data;
}
//尾插法插入数据
public void addEnd(int data){
lnodeUnion newNode = new lnodeUnion(data);//生成一个新结点
if(head==null) {
head = newNode;
return;
}
lnodeUnion temp = head;
while(temp.next!=null) {
temp = temp.next;
}
temp.next = newNode;
}
//尾插法打印链表
public void printendNode() {
lnodeUnion temp = head;
while(temp!=null) {
System.out.print(temp.data+" ");
temp = temp.next;
}
}
//合并La,Lb为Lc
public void addAll(lnodeUnion a,lnodeUnion b) {
lnodeUnion nodeLc = new lnodeUnion();//创造个Lc的结点
lnodeUnion pa = a.head;//La的从头结点出发的可移动指针
lnodeUnion pb = b.head;//Lb的从头结点出发的可移动指针
if(head==null) {//让其头指向La或者Lb的头
if(pa.data>=pb.data) {
head = b.head;
pb = pb.next;//pb向后移动
}else {
head = a.head;
pa = pa.next;//pa向后移动
}
}
lnodeUnion temp = head;//Lc的从头结点出发的可移动指针
while((pa.next!=null)&&(pb.next!=null)) {//La和Lb都没走到表尾时
if(pa.data>pb.data) {
temp.next = pb;
temp = pb;
pb = pb.next;
}
else if(pa.data<pb.data) {
temp.next = pa;
temp = pa;
pa = pa.next;
}
else {
temp.next = pa;
temp.next.next = pb;
temp = pb;
pa = pa.next;
pb = pb.next;
}
}
while(pa.next==null) {//当La走到表尾时
if(pa.data>pb.data) {
temp.next = pb;
temp = pb;
pb = pb.next;
}
else{
temp.next = pa;
temp = pa;
pa.next = pb;
}
}
while(pb.next==null) {//当Lb走到表尾时
if(pb.data>pa.data) {
temp.next = pa;
temp = pa;
pa = pa.next;
}
else{
temp.next = pb;
temp = pb;
pb.next = pa;
}
}
}
public static void main(String[] args) {
lnodeUnion a = new lnodeUnion();//建一个头结点
a.addEnd(1);
a.addEnd(7);
a.addEnd(8);
System.out.print("创建链表La:");
a.printendNode();//打印数据
System.out.println("\t");
lnodeUnion b = new lnodeUnion();//建一个头结点
b.addEnd(2);
b.addEnd(4);
b.addEnd(6);
b.addEnd(8);
b.addEnd(10);
b.addEnd(11);
System.out.print("创建链表Lb:");
b.printendNode();//打印数据
System.out.println("\t");
lnodeUnion c = new lnodeUnion();
c.addAll(a, b);
System.out.print("合并为链表Lc:");
c.printendNode();
}
}