java编程实现将两个有序单链表LA,LB合并成新的LA
2017-10-13 09:38
253 查看
问题分析:本题要求利用原有的单链表LA,LB中的结点来产生一个新的链表LA,新的单链表首先以LA的头结点为头结点构成一个空表,然后用尾插法将LA LB中的各结点按从小到大顺序插入到新形成的链表中。
插入过程中引入3个指针pa,pb,pc,其中pa,pb分别指向LA,LB中当前待比较的结点,pc指向新链表的当前最后一个结点。pa,pb初始值指向LA,LB的首结点,pc初始值指向LA头结点。
当pa.getdata()<pb.getdata()时,pc.setnext(pa)否则pc.setnext(pb) 当其中一个单链表为空表时,只要将另一个单链表的剩余段链接在pc所指的结点之后。
结点类的描述:
public class Node {
private Object data; //存放结点值
private Node next; //后继节点的引用
public Node(){ //无参时构造函数
this(null,null);
}
public Node(Object data){ //带一个参数时都构造函数
this(data,null);
}
public Node(Object data,Node next){ //带两个参数时的构造函数
this.data=data;
this.next=next;
}
}
合并链表:import java.util.Scanner;
public class Linklist {
public Node head; //单链表的头指针
public Linklist(){
head=new Node();
}
public void insert(int i,Object x)throws Exception{ //在带头结点的单链表中的第i个结点之前插入一个值为x的新结点
int j=0;
Node p=head;
while(j<i&&p!=null){
p=p.next;
j++;
}
if(p==null||j>i){
throw new Exception("插入位置不合理");
}
Node s=new Node(x);
s.next=p.next;
p.next=s;
}
public void display(){ //输出单链表中所有结点
Node p=head.next;
while(p!=null){
System.out.print(p.data+" ");
p=p.next;
}
System.out.println();
}
public int length(){
Node p=head.next;
int length=0;
while(p!=null){
p=p.next;
length++;
}
return length;
}
public void create(int m)throws Exception{
Scanner sc=new Scanner(System.in);
for(int i=0;i<m;i++)
insert(length(),sc.next());
}
public static Linklist mergelist(Linklist LA,Linklist LB){
Node pa=LA.head.next;
Node pb=LB.head.next;
Node pc=LA.head;
while(pa!=null&&pb!=null){
int da=Integer.valueOf(pa.data.toString()); //把字符串转换成浮点数
int db=Integer.valueOf(pb.data.toString());
if(da<=db){ //将LA的结点加入到新的LA中
pc.next=pa;
pc=pa;
pa=pa.next;
}
else{ //将LB的结点加入到新的LB中
pc.next=pb;
pc=pb;
pb=pb.next;
}
}
pc.next=(pa!=null?pa:pb); //插入剩余结点
return LA;
}
public static void main(String[] args)throws Exception{
Linklist LA=new Linklist();
Linklist LB=new Linklist();
System.out.println("请按非递减方式输入4个数字");
LA.create(4); //尾插法创建单链表LA
System.out.println("请按非递减方式输入5个数字");
LB.create(5);
System.out.println("合并后的链表是");
mergelist(LA,LB).display();
}
}
插入过程中引入3个指针pa,pb,pc,其中pa,pb分别指向LA,LB中当前待比较的结点,pc指向新链表的当前最后一个结点。pa,pb初始值指向LA,LB的首结点,pc初始值指向LA头结点。
当pa.getdata()<pb.getdata()时,pc.setnext(pa)否则pc.setnext(pb) 当其中一个单链表为空表时,只要将另一个单链表的剩余段链接在pc所指的结点之后。
结点类的描述:
public class Node {
private Object data; //存放结点值
private Node next; //后继节点的引用
public Node(){ //无参时构造函数
this(null,null);
}
public Node(Object data){ //带一个参数时都构造函数
this(data,null);
}
public Node(Object data,Node next){ //带两个参数时的构造函数
this.data=data;
this.next=next;
}
}
合并链表:import java.util.Scanner;
public class Linklist {
public Node head; //单链表的头指针
public Linklist(){
head=new Node();
}
public void insert(int i,Object x)throws Exception{ //在带头结点的单链表中的第i个结点之前插入一个值为x的新结点
int j=0;
Node p=head;
while(j<i&&p!=null){
p=p.next;
j++;
}
if(p==null||j>i){
throw new Exception("插入位置不合理");
}
Node s=new Node(x);
s.next=p.next;
p.next=s;
}
public void display(){ //输出单链表中所有结点
Node p=head.next;
while(p!=null){
System.out.print(p.data+" ");
p=p.next;
}
System.out.println();
}
public int length(){
Node p=head.next;
int length=0;
while(p!=null){
p=p.next;
length++;
}
return length;
}
public void create(int m)throws Exception{
Scanner sc=new Scanner(System.in);
for(int i=0;i<m;i++)
insert(length(),sc.next());
}
public static Linklist mergelist(Linklist LA,Linklist LB){
Node pa=LA.head.next;
Node pb=LB.head.next;
Node pc=LA.head;
while(pa!=null&&pb!=null){
int da=Integer.valueOf(pa.data.toString()); //把字符串转换成浮点数
int db=Integer.valueOf(pb.data.toString());
if(da<=db){ //将LA的结点加入到新的LA中
pc.next=pa;
pc=pa;
pa=pa.next;
}
else{ //将LB的结点加入到新的LB中
pc.next=pb;
pc=pb;
pb=pb.next;
}
}
pc.next=(pa!=null?pa:pb); //插入剩余结点
return LA;
}
public static void main(String[] args)throws Exception{
Linklist LA=new Linklist();
Linklist LB=new Linklist();
System.out.println("请按非递减方式输入4个数字");
LA.create(4); //尾插法创建单链表LA
System.out.println("请按非递减方式输入5个数字");
LB.create(5);
System.out.println("合并后的链表是");
mergelist(LA,LB).display();
}
}
相关文章推荐
- 已知两个链表 la和 lb,其元素值递增排序。编程将la和lb合并成一个递减有序(相同值元素只保留一个)的链表lc。(北方名校经典试题) 本题选做
- 编程实现两个有序单链表的合并
- 编程实现合并两个有序单链表
- 两个有序单链表合并成一个有序单链表的java实现
- 两个有序单链表合并成一个有序单链表的java实现
- 编程实现合并两个有序单链表
- 单链表操作之合并两个有序单链表---递归 and 非递归实现
- 实现两个有序单链表的合并。要求:随机创建两个单链表,实现单链表的排序,再对两个有序单链表进行合并。
- 数据结构----实现对2个链表La,Lb有序合并,对相同的元素进行删除,
- Java 非递归 和非递归方法 实现两个有序单链表的合并
- 算法1-两个由小到大的有序集合合并成一个由大到小的集合(JAVA实现)
- Java实现合并两个有序序列算法示例
- 数据结构——算法之(033)(两个有序单链表合并为一个有序的单链表)
- 两个有序数组的合并排序,Java代码实现,并去重复,考虑空间利用率问题
- 合并两个有序单链表的递归方法
- 用递归方法实现两个链表head1和head2各自有序,请把它们合并成一个链表仍然有序。(c/c++)
- Leetcode:Merge Two Sorted Lists 合并两个有序单链表
- 不开辟新空间,两个有序单链表合并为一个有序单链表
- 链表的基本操作(创建,查找指定位置元素,删除指定元素,插入,倒置,去重,求集合的差,分别交换结点与交换结点值实现的冒泡排序,将两个有序链表合并成一个有序链表)c语言实现
- 两个有序单链表的合并&两个有序数组的合并