
ListNode(-1) 通常用来创建一个 "哑节点"(Dummy Node)。
简单来说,它就是一个虚拟的占位符,它的值(比如 -1)并不重要,重要的是能 钩住新链表的开头
python
# 创建一个哑节点,作为新链表的起点
prehead = ListNode(-1)
dummy = prehead
步骤拆解:
-
创建一个哑节点 prehead
-
比较 list1 和 list2 当前节点的值:
- 如果 list1.val <= list2.val,就把 list1 挂在 prev.next 上,然后 list1 后移
- 否则,把 list2 挂上去。
-
dummy 指针向后移动一位。
-
收尾工作:如果循环结束时,某个链表还有剩余,直接将其拼接到新链表的末尾。
时间复杂度: O ( n + m ) O(n + m) O(n+m)。
其中 n n n 和 m m m 分别是两个链表的长度
每个节点都只被访问和移动了一次。最坏的情况下(比如两个链表的值交替出现),我们需要遍历完两个链表的所有节点。
空间复杂度: O ( 1 ) O(1) O(1)
通过修改指针的指向(dummy.next = list1),直接把原有的节点"拼"在了一起。
我们只额外使用了常数个指针变量(prehead 和 dummy)
python
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
if not list1:
return list2
if not list2:
return list1
# 创建一个哑节点,作为新链表的起点
prehead = ListNode(-1)
dummy = prehead
while list1 and list2:
# list1节点小,挂list1节点
if list1.val <= list2.val:
dummy.next = list1
list1 = list1.next # 检查list1下一个节点
else: # list2节点小,挂list2节点
dummy.next = list2
list2 = list2.next
# 每接好一个节点,dummy 也要往后走一步 ---
dummy = dummy.next
# 有一个链表已经用完
if list1:
dummy.next = list1
else:
dummy.next = list2
# 两个都空不用挂
return prehead.next
ListNode(val) :括号里的 -1 对应的正是这个节点的 val(数值)
python
class ListNode:
def __init__(self, val=0, next=None):
self.val = val # 节点存储的数值
self.next = next # 指向下一个节点的指针
当调用 ListNode(-1) 时,实际上是创建了一个对象:
- self.val = -1
- self.next = None