9、单链表的合并,两个有序单链表,合并为一个有序链表。

1、带头节点的单链表,

//定义结点类
class TestNode{
	public int data;
	public TestNode next = null;
	
	public TestNode(int data){
		this.data = data;
	}
}

//链表合并
public class Merge {
	public static void main(String[] args){
		TestNode n00 = new TestNode(0);
		TestNode n1 = new TestNode(1);
		n00.next = n1;
		TestNode n12 = new TestNode(2);
		n1.next = n12;
		//System.out.println(n1.next.data);
		TestNode n13 = new TestNode(5);
		n12.next = n13;
		TestNode n14 = new TestNode(6);
		n13.next = n14;
		
		TestNode n20 = new TestNode(0);
		TestNode n2 = new TestNode(3);
		n20.next = n2;
		TestNode n22 = new TestNode(7);
		n2.next = n22;
		TestNode n23 = new TestNode(8);
		n22.next = n23;
		TestNode n24 = new TestNode(9);
		n23.next = n24;
		TestNode n25 = new TestNode(10);
		n24.next = n25;
		
		TestNode h = merge(n00,n20);
		TestNode p = h.next;
		while(p != null){
			System.out.println(p.data);
		    p = p.next;
		}
	}
	public static TestNode merge(TestNode n1,TestNode n2){
		TestNode p1 = n1.next;

		TestNode head = n1;
		TestNode p2 = n2.next;

		TestNode p3 = n1;
	
		while(p1!=null && p2!=null){
			if(p1.data <= p2.data){
				
				p3.next = p1;
				p3 = p1;
				p1 = p1.next;
			}
			else{
				p3.next = p2;
				p3 = p2;
				p2 = p2.next;
			}
		}
		
		if(p1==null && p2!=null){
			p3.next = p2;
		}else{
			p3.next = p1;
		}
		
		return head;
	}
	


}

2、不带头结点的单链表



//无头节点的两个有序链表合并为一个有序链表
public class ListMerge{
	public static void main(String[] args){
		Node n1 = new Node(1);
		Node n2 = new Node(2);
		n1.next = n2;
		Node n3 = new Node(5);
		n2.next = n3;
		
		Node m1 = new Node(4);
		Node m2 = new Node(6);
		m1.next = m2;
		Node m3 = new Node(9);
		m2.next = m3;
		Node m4 = new Node(10);
		m3.next = m4;
		
		Node q = merge(n1,m1);
		while(q != null){
		System.out.println(q.data);
		q = q.next;
		}
	}
	public static Node merge(Node n1,Node n2){
		Node p1 = n1;
		Node p2 = n2;
		Node p3 = null;
		Node head = null;
		if(p1.data<p2.data){
			head = n1;
			p1 = p1.next;//开始的时候把这句忘了写了
			
		
		}
		else{
			head = n2;
			p2 = p2.next;//类似的,这句也不要忘了写.
			
		}
		p3 = head;
		
		while(p1!=null && p2!=null){
			if(p1.data<p2.data){
				p3.next=p1;//p3指针链接第一个链表中的值,把第二个链表中的结点链到已排序的链

				p3 = p1;//p3向前移动一个
				p1 = p1.next;//p1向前移动一个
			}
			else{
				p3.next = p2;//p3指针连接第二个链表中的值,把第二个链表中的结点链到已排序的链上
				p3 = p2;   //p3向前移动一个
				p2 = p2.next;//p2向前移动一个
			}
		}
		if(p1==null){//当p1中无元素的时候,即p1中所有元素已经被链接完了
			p3.next = p2;
		}
		else{//当p2中无元素的时候
			p3.next = p1;
		}
		return head;
	}
}

//结点类
class Node{
	int data;
	Node next = null;
	public Node(int data){
		this.data = data;
	}



其中,不带头结点的运行有问题,不知道在哪里,需要再调试。。。很诡异的错误,不知道哪里错了,希望有高手指点。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值