Problem: 142. 环形链表 II
思路
链表中的环,可考虑用快慢指针来做。先通过快慢指针找到相遇点,再从相遇点和起始点开始遍历,第一次相交的地方就是环形起点
解题方法
定义快指针两步两步的遍历链表,慢指针一步一步的遍历链表,若快慢指针相遇,那重新定义两个指针,分别从头结点和相遇结点开始向前走,直到再次相遇,输出该相遇结点,否则表示链表无环,输出None.
复杂度
时间复杂度:
O ( n ) O(n) O(n)
空间复杂度:
O ( 1 ) O(1) O(1)
Code
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:
fast, slow = head, head
while fast and fast.next:
fast = fast.next.next
slow = slow.next
if fast == slow:
fast = head
while fast!=slow:
fast = fast.next
slow = slow.next
return fast
return None