Leetcode-.21合并两个有序链表
迭代法 (Iteration)
迭代法是最直观、空间效率最高的方法。它的核心思想是创建一个新的链表,然后同时遍历 list1
和 list2
,逐个比较节点的值,将较小的节点依次链接到新链表的末尾。
关键技巧:哨兵节点 (Sentinel Node)
为了简化在空链表上添加第一个节点的操作,我们通常会创建一个“哨兵节点”(也叫虚拟头节点 dummy
)。它不存储任何有效数据,只是作为新链表的临时头部。我们同时用一个 tail
指针来追踪新链表的最后一个节点,方便我们进行添加操作。
算法步骤:
-
初始化:
-
创建一个哨兵节点
dummy = ListNode()
。 -
创建一个指针
tail = dummy
,tail
将永远指向新链表的尾部。
-
-
主循环:当
list1
和list2
都不为空时,进行循环:-
比较
list1.val
和list2.val
的大小。 -
如果
list1.val
更小,就将list1
的当前节点链接到tail.next
,然后将list1
指针后移一位。 -
否则,将
list2
的当前节点链接到tail.next
,然后将list2
指针后移一位。 -
无论链接了哪个节点,都必须将
tail
指针后移一位 (tail = tail.next
),以确保它始终指向新链表的末尾。
-
-
处理剩余部分:循环结束后,
list1
和list2
最多只有一个还不为空。我们直接将这个非空的链表剩余的所有部分链接到tail.next
即可。 -
返回结果:合并后的新链表的真正头节点是哨兵节点的下一个节点,即
dummy.next
。
# Definition for singly-linked list.# class ListNode:# def __init__(self, val=0, next=None):# self.val = val# self.next = nextclass Solution:def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:dummy=ListNode()tail=dummyp=list1q=list2while p and q:if p.val>=q.val:tail.next=qq=q.nextelse:tail.next=pp=p.nexttail=tail.nextif p==None:tail.next=qif q==None:tail.next=preturn dummy.next