java编程实现将两个有序单链表LA,LB合并成新的LA

问题分析:本题要求利用原有的单链表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();  
	    }  
}


  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值