链表-合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
示例 2:
输入:l1 = [], l2 = []
输出:[]
示例 3:
输入:l1 = [], l2 = [0]
输出:[0]
代码如下:
1 | public static ListNode mergeTwoLists(ListNode l1, ListNode l2){ |
我们的 while 循环每次比较 p1
和 p2
的大小,把较小的节点接到结果链表上。
形象地理解,这个算法的逻辑类似于拉拉链,l1, l2
类似于拉链两侧的锯齿,指针 p
就好像拉链的拉索,将两个有序链表合并;或者说这个过程像蛋白酶合成蛋白质,l1, l2
就好比两条氨基酸,而指针 p
就好像蛋白酶,将氨基酸组合成蛋白质。
代码中还用到一个链表的算法题中是很常见的「虚拟头结点」技巧,也就是 dummy
节点。你可以试试,如果不使用 dummy
虚拟节点,代码会复杂很多,而有了 dummy
节点这个占位符,可以避免处理空指针的情况,降低代码的复杂性。