1.题目描述
Given a linked list, return the node where the cycle begins. If there is no cycle, return null
.
Note: Do not modify the linked list.
Follow up:
Can you solve it without using extra space?
2. 解题思路
这个题目是基于Linked List Cycle上的进一步拓展。
1)如果链表中不包含环,则问题至此解决;
2)如果链表包含环,Linked List Cycle中的算法找到了快指针和慢指针相遇的节点,记该节点为
P,记链表的头为head,环形链表的起始点为start(即为本问题需要找到的点)。
记:head到start之间的长度为a,环形链表的长度为c,环形链表中start到P的长度为x,则可以知道,
在快指针和慢指针相遇之前,它们所走的路程分别为:
快指针:a+nc+x
慢指针:a+x
二者所用时间相同,有等式a+nc+x=2*(a+x),有nc=a+x, 即nc-x=a,
物理含义为:head到start之间的长度等于P到start之间的长度+若干个环的长度。
所以只需要在重新找另一个满指针其起始点在head处,原有慢指针在P处,二者同时出发,每次都
只走一步,两个指针第一次相遇的地方就是环形链表的起始点start处。该问题解决。
3.代码实现
下面给出用python实现的代码。
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def detectCycle(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
pfast,pslow=head,head
while(pfast!=None and pfast.next!=None):
pfast=pfast.next.next
pslow=pslow.next
if (pslow==pfast):
pslow2=head
while(pslow2!=pslow):
pslow2=pslow2.next
pslow=pslow.next
return pslow
return None
以上。