Problem: 21. 合并两个有序链表
思路
参考:
解题方法
- 为了更方便的进行合并,有必要创建一个伪节点/哨兵节点(
dummy = curr = ListNode()
),以哨兵节点开始进行双链表的合并。哨兵节点 (dummy
)实际上一个常见的链表处理技巧。创建一个哨兵(或称哑节点)节点dummy
,使得链表操作更加简化,因为我们不需要单独处理空链表的情况。此节点不存储任何实际数据,但其next
指针会指向合并后链表的头节点; - 当某一个链表遍历完,则可以终止迭代,并将另一个链表直接加在合并过的链表后面;
- 清楚在迭代中链表合并过程里的coding细节,比如:节点通过指针实现合并(
curr.next = list1
),节点通过指针实现移动(list2 = list2.next
); - 链表的操作均通过节点实现,list1和list2作为节点均可以移动。
Code
# 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]:
dummy = curr = ListNode() # 构建哨兵节点,方便链表合并
while list1 and list2: # 当list1或list2有一个遍历完则停止
if list1.val < list2.val: # 合并list1节点
curr.next, list1 = list1, list1.next # 比下面的写法更简练
else: # 合并list2节点
curr.next = list2 # 合并节点
list2 = list2.next # 移动节点
curr = curr.next # 移动curr节点
curr.next = list1 if list1 else list2
return dummy.next # 返回哨兵节点后的链表,即为合并链表