通过递归和迭代两种方式合并两个有序链表
/**
* @Author: DiTian
* @Description: 合并两个有序链表
* @Date: Created in 10:03 2021/8/6
*/
public class MergeTwoList {
//创建节点类
static class LinkedNode{
private int val;
private LinkedNode next;
public LinkedNode(int val) {
this.val = val;
this.next = null;
}
//追加节点
public void add(int val){
LinkedNode newNode = new LinkedNode(val);
if (this.next == null){
this.next = newNode;
}else{
this.next.add(val);
}
}
//打印链表
public void print(){
System.out.print(this.val);
if (this.next != null){
System.out.print("--->");
this.next.print();
}
}
}
public static void main(String[] args) {
LinkedNode linkedA = new LinkedNode(1);
linkedA.add(2);
linkedA.add(5);
linkedA.add(7);
linkedA.add(10);
LinkedNode linkedB = new LinkedNode(1);
linkedB.add(3);
linkedB.add(5);
linkedB.add(6);
linkedB.add(8);
System.out.print("链表A:");
linkedA.print();
System.out.println();
System.out.print("链表B:");
linkedB.print();
System.out.println();
//1.递归方式合并有序链表
/*LinkedNode merge1 = mergeTwoLinkedList1(linkedA,linkedB);
System.out.print("递归方式合并有序链表:");
merge1.print();
System.out.println();*/
//2.迭代方式合并有序链表
LinkedNode merge2 = mergeTwoLinkedList2(linkedA,linkedB);
System.out.print("迭代方式合并有序链表:");
merge2.print();
System.out.println();
}
private static LinkedNode mergeTwoLinkedList2(LinkedNode linkedA, LinkedNode linkedB) {
LinkedNode preHead = new LinkedNode(-1);
LinkedNode pre = preHead;
while (linkedA != null&&linkedB != null){
if (linkedA.val<= linkedB.val){
pre.next = linkedA;
linkedA = linkedA.next;
}else{
pre.next = linkedB;
linkedB = linkedB.next;
}
pre = pre.next;
}
//把长链表的多余节点直接追加尾部
pre.next = linkedA==null?linkedB:linkedA;
return preHead.next;
}
private static LinkedNode mergeTwoLinkedList1(LinkedNode linkedA, LinkedNode linkedB) {
if (linkedA == null){
return linkedB;
}else if (linkedB == null){
return linkedA;
}else if (linkedA.val< linkedB.val){
linkedA.next = mergeTwoLinkedList1(linkedA.next,linkedB);
return linkedA;
}else {
linkedB.next = mergeTwoLinkedList1(linkedA,linkedB.next);
return linkedB;
}
}
}