[LeetCode]142. Linked List Cycle II

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
        

以上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值