package com.camnter.basicexercises.linklist; import com.camnter.basicexercises.core.Node; /** * 合并两个有序链表 *

* 找一个头较小的 链表 * cur1 记录头较小的链表 * cur2 记录头较大的链表 * pre 记录上次 比较时 较小的 节点 *

* 一起走 * 比较后,较小的往前走 * 因为,此前 cur1 记录头较小的链表 * 所以,cur1 较小往前走,不操作 cur2,pre 顺带记录一下 *

* cur2 较小的话 * 先保存 cur2.next,因为等下要操作 cur2 * pre 记录上次 比较时 较小的 节点 * 所以 pre.next = cur2 * cur2.next = cur1 * 完成 cur2 并入到 cur1 的链表 * 最后拿到刚才保存的 cur2.next * 作为 cur2 的新引用,继续走 *

* 最后的最后,处理一下长短不一的问题,谁没走完,就把它并入到 pre 后,即 pre.next * * @author CaMnter */ public class MergingOrderedLinkLists> { public Node mergingOrderedLinkLists(Node head1, Node head2) { if (head1 == null || head2 == null) { return head1 == null ? head2 : head1; } // 选头较小的作为返回的 head Node head = head1.value.compareTo(head2.value) <= 0 ? head1 : head2; // 头比较小 链表 Node cur1 = head == head1 ? head1 : head2; // 头比较大 链表 Node cur2 = head == head1 ? head2 : head1; // pre 表示上次 比较时 较小的 节点 Node pre = cur1; Node temp = null; while (cur1 != null && cur2 != null) { if (cur1.value.compareTo(cur2.value) <= 0) { // cur1 较小 pre = cur1; cur1 = cur1.next; } else { // cur2 较小, temp = cur2.next; // 并入 cur1 所在的链表中 pre.next = cur2; cur2.next = cur1; // 继续记录较小节点 pre = cur2; // cur2 往下走 cur2 = temp; } } // 处理 两个链表不同长度的情况 pre.next = cur1 == null ? cur2 : cur1; return head; } public static void main(String[] args) { Node node1 = new Node(1); node1.next = new Node(3); node1.next.next = new Node(5); node1.next.next.next = new Node(7); node1.next.next.next.next = new Node(9); Node node2 = new Node(2); node2.next = new Node(4); node2.next.next = new Node(6); node2.next.next.next = new Node(8); MergingOrderedLinkLists mergingOrderedLinkLists = new MergingOrderedLinkLists(); Node.printLinkList(mergingOrderedLinkLists.mergingOrderedLinkLists(node1, node2)); } }