Leetcode原题链接:环形链表Ⅱ
一、思路
1、分解为两步:
- 判断是否有环,快慢指针法。
- 若有环,取快慢指针相遇处为index1,取头节点为index2,再次相遇时即为环的起始节点。
2、个人没想出来的难点:
- 运用数学方法去找各个路径之间的关联。
- 可以由
2(x+y)=x+y+n(y+z)
得x=(n-1)(y+z)+z
。当n=1时,x=z,即两节点分别从快慢指针相遇节点和头节点出发,二者将在环形入口相遇;当n>1时,相当于从快慢指针相遇节点出发的指针在转了几圈后,与从头节点出发的指针在环形入口相遇。
二、题解
python代码如下:
# 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 = head
slow = head
while(fast != None and fast.next != None):
slow = slow.next
fast = fast.next.next
if fast == slow:
index1 = fast
index2 = head
break
if fast == None or fast.next == None:
return None
else:
while(index1 != index2):
index1 = index1.next
index2 = index2.next
return index1
参考:代码随想录