/**
* @author mccrea
* @version 1.0
* @description: 两个有序链表合并
* @date 2020/9/11 23:18
*/
public class SingleListMergeDemo {
public static void main(String[] args) {
SingleListMerge singleListCircle = new SingleListMerge();
MergeNode circleNode1 = new MergeNode(3);
MergeNode circleNode2 = new MergeNode(2);
MergeNode circleNode3 = new MergeNode(16);
MergeNode circleNode4 = new MergeNode(4);
MergeNode circleNode5 = new MergeNode(8);
MergeNode circleNode6 = new MergeNode(6);
singleListCircle.addNodeSort(circleNode1);
singleListCircle.addNodeSort(circleNode2);
singleListCircle.addNodeSort(circleNode3);
singleListCircle.addNodeSort(circleNode4);
singleListCircle.addNodeSort(circleNode5);
singleListCircle.addNodeSort(circleNode6);
System.out.println("链表一============");
singleListCircle.showList();
SingleListMerge singleListCircle2 = new SingleListMerge();
MergeNode circleNode7 = new MergeNode(1);
MergeNode circleNode8 = new MergeNode(5);
MergeNode circleNode9 = new MergeNode(9);
MergeNode circleNode10 = new MergeNode(6);
MergeNode circleNode11 = new MergeNode(13);
MergeNode circleNode12 = new MergeNode(15);
singleListCircle2.addNodeSort(circleNode7);
singleListCircle2.addNodeSort(circleNode8);
singleListCircle2.addNodeSort(circleNode9);
singleListCircle2.addNodeSort(circleNode10);
singleListCircle2.addNodeSort(circleNode11);
singleListCircle2.addNodeSort(circleNode12);
System.out.println("链表二============");
singleListCircle2.showList();
SingleListMerge singleListMerge = new SingleListMerge();
singleListMerge.mergeNode(singleListCircle.getHead(), singleListCircle2.getHead());
System.out.println("合并后=============");
singleListMerge.showList();
}
}
/**
* @description: 节点类
* @author mccrea
* @date 2020/9/11 23:31
* @version 1.0
*/
class MergeNode {
/**
* 数据
*/
public int data;
/**
* 下一个节点
*/
public MergeNode next;
/**
* 构造函数
*
* @param data 传入的数据
*/
public MergeNode(int data) {
this.data = data;
}
@Override
public String toString() {
return "CircleNode{" +
"data=" + data +
'}';
}
}
/**
* @description: 用来合并的单链表
* @author mccrea
* @date 2020/9/11 23:31
* @version 1.0
*/
class SingleListMerge {
/**
* @description:
* @param: * @param null
* @return:
* @author mccrea
* @date: 2020/9/11 23:31
*/
private MergeNode head = new MergeNode(0);
/**
* @description: 有序增加节点
* @author mccrea
* @date 2020/9/11 23:33
* @version 1.0
*/
public void addNodeSort(MergeNode mergeNode) {
// 指针
MergeNode temp = head;
while (temp.next != null) {
// 指针下一节点值大于加入节点值,需要把加入节点放入指针和下一节点之间
if (temp.next.data > mergeNode.data) {
break;
}
temp = temp.next;
}
mergeNode.next = temp.next;
temp.next = mergeNode;
}
/**
* @description: 打印节点
* @author mccrea
* @date 2020/9/11 23:43
* @version 1.0
*/
public void showList() {
if (head.next == null) {
System.out.println("链表为空~");
return;
}
MergeNode temp = head.next;
while (temp != null) {
System.out.println(temp);
temp = temp.next;
}
}
/**
* @description: 获取头节点
* @param: * @param
* @return: com.mccrea.structure.MergeNode
* @author mccrea
* @date: 2020/9/11 23:48
*/
public MergeNode getHead() {
return head;
}
/**
* @description: 合并俩个有序链表
* @author mccrea
* @date 2020/9/11 23:49
* @version 1.0
*/
public void mergeNode(MergeNode node1, MergeNode node2) {
//一号指针
MergeNode temp1 = node1.next;
//二号指针
MergeNode temp2 = node2.next;
//合并后链表指针
MergeNode temp = head;
// 一号临时指针
MergeNode next1;
// 二号临时指针
MergeNode next2;
while (temp1 != null && temp2 != null) {
// 接入temp2节点
if (temp1.data > temp2.data) {
// temp2下一节点临时存储
next2 = temp2.next;
// temp2指向temp下一节点
temp2.next = temp.next;
// temp指向temp2
temp.next = temp2;
// temp2后移
temp2 = next2;
// 接入temp1节点
} else {
next1 = temp1.next;
temp1.next = temp.next;
temp.next = temp1;
temp1 = next1;
}
// 合并后的链表指针后移
temp = temp.next;
}
// temp1为空,temp2直接接上temp
if (temp1 == null) {
temp.next = temp2;
}
// temp2为空,temp1直接接上temp
if (temp2 == null) {
temp.next = temp1;
}
}
}