合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
解法一,迭代法:
这是我看到的一种解题思路,
一、哑节点
创建哑节点是为了标记合并链表的头节点,合并结束后,哑节点的下一个节点就是合并链表的头节点。这样做的目的是,l1和l2都有可能是我们合并链表的头节点,根据逻辑不同,可能有所不同,需要标记出来。
二、move游标变量
move变量主要记录合并链表的节点位置,随着合并链表节点数的增加始终指向最后一个节点的位置。
三、while循环
当l1和l2均不为空的情况下,对l1和l2实现遍历,直到某一个链表遍历结束,此时剩下的链表可能还没有遍历完
四、拼接剩余链表节点
对没有拼接到合并链表的节点实现拼接。
代码实现:
class Solution:
def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
# 定义一个哑节点,作为合并链表的头节点
dummy = ListNode(0)
# 定义一个游标,标记合并后链表的尾节点
move = dummy
# 当list1和list2都不为空的时候一直遍历
while list1 and list2:
# 当前list1的节点值小于list2的节点值时
if list1.val<=list2.val:
# move指向较小值的节点
move.next=list1
list1=list1.next
else:
# move指向较小值的节点
move.next=list2
list2=list2.next
move = move.next
# 将没有遍历完的节点拼接到move后面
move.next=list1 if list1 else list2
# dummy是哑节点,在执行第一次判断时已经固定指向头节点,即当第一次执行move.next的时候
return dummy.next