题目:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4]
解题思路:我们可以把两个链表合并进入一个新链表中;也可以寻找两个链表的头结点比较小的值,将另一个链表(L2)的节点插入到头结点比较小的链表(L1)中
package code.code_02; /** * 力扣原题 https://leetcode.cn/problems/merge-two-sorted-lists/ * 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 * 输入:l1 = [1,2,4], l2 = [1,3,4] * 输出:[1,1,2,3,4,4] * * 解题思路: 此题比较简单,就是单纯的合并2个链表,将数据合并进入长链表中 * 先检查哪个链表的首节点比较小,数据往首节点比较小的链表中插入。 * * 一开始我是准备往长链表中插入数据,但是发现有可能频繁更新长链表的头结点,逻辑会比较复杂,这不是一个好思路 */ public class MergeTwoListTest { public class ListNode { int val; ListNode next; ListNode() {} ListNode(int val) { this.val = val; } ListNode(int val, ListNode next) { this.val = val; this.next = next; } } private ListNode getInsertNode (ListNode minStart, int value) { ListNode node = minStart; while (minStart != null && minStart.val < value) { if (minStart.next == null || minStart.next.val >= value) { node = minStart; } minStart = minStart.next; } return node; } public ListNode mergeTwoLists(ListNode list1, ListNode list2) { if (list1 == null) { return list2; } else if (list2 == null) { return list1; } ListNode minStart = (list1.val <= list2.val) ? list1 : list2; ListNode maxStart = (minStart == list1) ? list2 : list1; ListNode nextMin = null; ListNode nextMax = null; ListNode node = minStart; while (maxStart != null) { ListNode InserAfterNode = this.getInsertNode(minStart, maxStart.val); //如果要插入的链表已经到达链表尾部, nextMin = InserAfterNode.next; nextMax = maxStart.next; maxStart.next = null; //插入节点 InserAfterNode.next = maxStart; InserAfterNode = maxStart; if (nextMin != null) { //将新插入的节点,持有原最小节点的下一个节点 InserAfterNode.next = nextMin; /** * 此处要尤为注意,需要考虑重复元素的问题,千万不要 * 这样: * InserAfterNode = nextMin * minStart = InserAfterNode * * 如果按照以上的写法,会出错,case为 * l1 = [-10,-9,-6,-4,1,9,9] * l2 = [-5,-3,0,7,8,8] */ minStart = InserAfterNode; } //待插入节点来到下一个节点位置 maxStart = nextMax; } return node; } // 先设计打印方法,方便检查逆转后结果 public void printNode (ListNode node) { if (node == null) { System.out.println("链表不存在"); } System.out.println("当前节点的值为: " + node.val); //递归的方式逐层打印Node的子节点 if(node.next != null) { printNode(node.next); } } public static void main(String[] args) { MergeTwoListTest test = new MergeTwoListTest(); //链表1 /* ListNode l1 = test.new ListNode(1); l1.next = test.new ListNode(2); l1.next.next = test.new ListNode(4); //链表2 ListNode l2 = test.new ListNode(1); l2.next = test.new ListNode(3); l2.next.next = test.new ListNode(4);*/ ListNode l1 = test.new ListNode(-10); l1.next = test.new ListNode(-9); l1.next.next = test.new ListNode(-6); l1.next.next.next = test.new ListNode(-4); l1.next.next.next.next = test.new ListNode(1); l1.next.next.next.next.next = test.new ListNode(9); l1.next.next.next.next.next.next = test.new ListNode(9); //链表2 ListNode l2 = test.new ListNode(-5); l2.next = test.new ListNode(-3); l2.next.next = test.new ListNode(0); l2.next.next.next = test.new ListNode(7); l2.next.next.next.next = test.new ListNode(8); l2.next.next.next.next.next = test.new ListNode(8); ListNode nodeList = test.mergeTwoLists(l1, l2); test.printNode(nodeList); } }
实测结果:
标签:ListNode,val,minStart,next,链表,算法,升序,LeetCode From: https://www.cnblogs.com/chen1-kerr/p/16926689.html