两个有序链表的合并
作者:互联网
package class04; /*** * 两个有序链表的合并 * * 给定两个有序链表的头节点head1和head2, * 返回合并之后的大连表,要求依然有序。 */ public class Code06_MergeTwoSortedLinkedList { public static class ListNode { public int val; public ListNode next; } /** * @param head1 链表1的头节点 * @param head2 链表2的头节点 * @return 合并后的长链表的头节点 */ public static ListNode mergeTwoLists(ListNode head1, ListNode head2) { //只要有一个短链表的头节点,是空,就直接返回两一个短链表的头节点。 if (head1 == null || head2 == null) { return head1 == null ? head2 : head1; } //如果两个短链表,都不是空。 //如果链表1的头节点的值,小于等于链表2的头节点的值。则将head1标记为合并后,长链表的头节点。并用head指向head1。 ListNode head = head1.val <= head2.val ? head1 : head2; ListNode cur1 = head.next;//cur1跳一步 //如果长链表的头节点就是head1,则将cur2指向链表2的头节点head2。否则,将cur2指向链表1的头节点head1。 ListNode cur2 = head == head1 ? head2 : head1; //定义一个pre节点,指向长链表的头节点。 ListNode pre = head; //如果cur1不为空,并且cur2不为空。 while (cur1 != null && cur2 != null) { //如果cur1的值小于等于cur2的值 if (cur1.val <= cur2.val) { //将pre的next指向cur1 pre.next = cur1; //cur1跳一步 cur1 = cur1.next; } else {//cur1.val > cur2.val //将pre的next指向cur2 pre.next = cur2; //cur2跳一步 cur2 = cur2.next; } //pre跳一步 pre = pre.next; } //走到这一步,说明链表1和链表2,至少有一个走完了。 //如果cur1为空,则将pre的next直系那个cur2;否则,将pre的next指向cur1。 //即使当cur1为空时,cur2的后边还有多个节点,也不需要遍历了,直接将pre的next指向cur2,后边的所有节点不同。 //当cur2为空时,同理。 pre.next = cur1 == null ? cur2 : cur1; //返回之前早就定好的长链表的头节点head return head; } }
标签:pre,cur2,head1,合并,next,链表,有序,节点 来源: https://www.cnblogs.com/TheFloorIsNotTooHot/p/16536055.html