您的位置:首页 > 其它

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

2012-09-11 11:30 435 查看
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;}
其中,不带头结点的运行有问题,不知道在哪里,需要再调试。。。很诡异的错误,不知道哪里错了,希望有高手指点。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐