算法6:LeetCode_合并两个有序链表
题目:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
输入: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); } }
实测结果:

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)