课后练习题目要求: 合并两个单链表,且合并后的链表仍保持有序。
代码:
public class Exercise {
public static void main(String[] args) {
SingleLinkedListMerge singleLinkedListMerge1 = new SingleLinkedListMerge();
singleLinkedListMerge1.addByOrder(new Node(1));
singleLinkedListMerge1.addByOrder(new Node(3));
singleLinkedListMerge1.addByOrder(new Node(2));
singleLinkedListMerge1.addByOrder(new Node(4));
singleLinkedListMerge1.addByOrder(new Node(5));
System.out.println("第一个链表");
singleLinkedListMerge1.show();
SingleLinkedListMerge singleLinkedListMerge2 = new SingleLinkedListMerge();
singleLinkedListMerge2.addByOrder(new Node(1));
singleLinkedListMerge2.addByOrder(new Node(3));
singleLinkedListMerge2.addByOrder(new Node(6));
singleLinkedListMerge2.addByOrder(new Node(8));
singleLinkedListMerge2.addByOrder(new Node(7));
System.out.println("第二个链表");
singleLinkedListMerge2.show();
//合并后的链表
withList(singleLinkedListMerge1.getHead(), singleLinkedListMerge2.getHead());
System.out.println("合并后的链表");
singleLinkedListMerge2.show();
}
public static Node withList(Node head1, Node head2) {
if (head1 == null && head2 == null){
System.out.println("两个链表为空");
return null;
}
if (head1 == null){
System.out.println("head2");
return head2;
}
if (head2 == null){
System.out.println("head1");
return head1;
}
Node head;
if (head1.no > head2.no) {
head = head2;
head.next = withList(head1, head2.next);
} else {
head = head1;
head.next = withList(head1.next, head2);
}
return head;
}
}
class SingleLinkedListMerge {
//先初始化一个头结点,头结点不能动
private Node head = new Node(0);
public Node getHead() {
return head;
}
public void addByOrder(Node node) {
Node temp = head;
boolean flag = false;
while(true) {
if (temp.next == null) {
break;
}
if (temp.next.no > node.no) {
break;
} else if (temp.next.no == node.no) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
System.out.printf("欲插入的编号%d 已经存在不能加入\n",node.no);
}else {
node.next = temp.next;
temp.next = node;
}
}
public void show() {
Node temp = head.next;
if (temp == null) {
System.out.println("该链表为空");
return;
}
while(temp != null) {
System.out.println(temp.no);
temp = temp.next;
}
}
}
//定义HeroNode,每个HeroNode对象就是一个节点
class Node {
public int no;
public Node next;//next是对象变量,凡是对象变量,保存的皆是指针
public Node() {
}
//构造器
public Node(int no) {
this.no = no;
}
//为了显示方法,重写toString方法
@Override
public String toString() {
return "HeroNode{" +
"no=" + no +
'}';
}
}