(1)21.合并两个有序链表
class Solution:
def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
dummyHead = ListNode(next = None)
prev = dummyHead
while list1 and list2:
if list1.val <= list2.val:
prev.next = list1
list1 = list1.next
else:
prev.next = list2
list2 = list2.next
prev = prev.next
prev.next = list1 if list1 is not None else list2
return dummyHead.next
(2)206.反转链表
class Solution:
def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
curse = head
prev = None
while curse != None:
# 记录下次要反转的位置
tempNext = curse.next
# 反转
curse.next = prev
# 更新指针
prev = curse
curse = tempNext
return prev
(3)876.链表的中间结点
快慢指针
class Solution:
def middleNode(self, head: ListNode) -> ListNode:
fast, slow = head, head
while fast and fast.next:
fast = fast.next.next
slow = slow.next
return slow
(4)142.环形链表
给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
解题思路:双指针
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def detectCycle(self, head: ListNode) -> ListNode:
slow, fast = head, head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
# 相遇
if slow == fast:
p = head
q = slow
while p != q:
p = p.next
q = q.next
return p
return None