问题: 合并两个有序链表
链表L1: 1->2->4->9
链表L2: 3->5>6->10->13
合并后:1->2->3->4->5->6->9->10->13
1. 准备数据结构 及测试数据
Node节点
public class Node {public Integer value;public Node next;// 构造public Node(){}public Node(Integer value) {this.value = value;}public Node(Integer value,Node next) {this.value = value;this.next = next;}// 打印链表public void print() { Node n = this; System.out.println("------------------------------------------------"); while (n != null) { System.out.print(n.value); n = n.next; if (n != null) { System.out.print("-->"); } else { System.out.println(); } } System.out.println("------------------------------------------------");}}
准备测试数据
public class TestNode {public static void main(String[] args) {Node L1= getL1();Node L2= getL2();// 1-->2-->4-->9L1.print();// 3-->5-->6-->10-->13L2.print();}// 获取测试数据L1public static Node getL1() {Node head = new Node(1,new Node(2,new Node(4,new Node(9))));return head;}// 获取测试数据L2public static Node getL2() {Node head = new Node(3,new Node(5,new Node(6,new Node(10,new Node(13)))));return head;}}
2.解决方案01
定义一个伪头节点Head 然后遍历L1 L2 比较Node值 小的就追加到Head后边
private static Node mergeNodes(Node l1, Node l2) {if (l1 == null ){return l2;}if (l2 == null) {return l1;}// 链表头Node head ;// 新链表添加的当前位置Node next ;// 先选出一个2个链表开头的最小值head = next = l1.value > l2.value ? l2:l1;// 头指针向后移动l1 = head == l1 ? l1.next : l1;l2 = head == l2 ? l2.next : l2;// 遍遍历2个链表while (l1 !=null && l2 != null) {// 遍历链表的最大值Node maxNode = null;// 链表1值大if(l1.value <= l2.value) {maxNode = l1;l1 = l1.next;} else {// 链表2值大maxNode = l2;l2 = l2.next;}// 添加到新链表 next向后移next.next = maxNode;next = next.next;}// 判断哪个链表还没有遍历完 直接加到新链表末尾next.next = l1 == null ? l2 :l1;// 返回headreturn head;}
3.解决方案02
定义一个伪头节点Head 然后遍历L1 L2 比较Node值 小的就追加到Head后边
使用递归 不用while循环
private static Node mergeNodesRec(Node l1, Node l2) {// 如果l1 链表已经遍历完了if (l1 == null) {return l2;}// 如果l2 链表已经遍历完了if (l2 == null) {return l1;}Node head ;if(l1.value <= l2.value) {head = l1;l1 = l1.next;} else {head = l2;l2 = l2.next;}// 递归调用 设置nexthead.next = mergeNodesRec(l1,l2);return head;}
自己写一写、用笔画一画 可能会豁然开朗 肯定还有其他写法 欢迎留言