java自写代码--线性表的应用

本文探讨了如何使用Java实现线性表的合并以及有序表的合并,包括普通实现和链表实现。详细介绍了算法步骤,分析了时间复杂度和空间复杂度,并给出了代码实现与运行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【都还有一些不完美的地方,比如说代码重复性较高的问题,待改正】

目录

一、线性表的合并

1.问题描述

2.算法步骤

  ①算法

  ②时间复杂度

3.代码实现

4.结果输出

二、有序表的合并

1.问题描述

2.算法步骤

 ①算法

 ②时间复杂度

③空间复杂度

3.代码实现

4.结果输出

三、有序表的合并--用链表实现

1.算法步骤

 ①算法图示过程

 ②算法

 ③时间复杂度

 ④空间复杂度

2.代码实现

3.结果输出


一、线性表的合并

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();
	}
}

3.结果输出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值