1. 程式人生 > >lintcode練習-103. 帶環連結串列 II

lintcode練習-103. 帶環連結串列 II

103. 帶環連結串列 II

給定一個連結串列,如果連結串列中存在環,則返回到連結串列中環的起始節點,如果沒有環,返回null。

樣例

給出 -21->10->4->5, tail connects to node index 1,返回10

挑戰

不使用額外的空間

解題思路:

1、定義一個快慢指標,

2、如果連結串列無環,那麼fast一定會遇到終點,返回none。

3、如果連結串列有環,則兩個連結串列一定會相遇,當兩個相遇以後,fast重新回到head的位置,slow不動。然後fast指標和slow指標每次都移動一步,繼續遍歷

4、當兩個指標再次相遇時,就是第一個入環的結點。

"""
Definition of ListNode
class ListNode(object):

    def __init__(self, val, next=None):
        self.val = val
        self.next = next
"""


class Solution:
    """
    @param: head: The first node of linked list.
    @return: The node where the cycle begins. if there is no cycle, return null
    """
    def detectCycle(self, head):
        # write your code here
        if head is None or head.next is None or head.next.next is None:
            return None
        slow, fast = head.next, head.next.next
        while slow!= fast:
            if fast.next is None or fast.next.next is None:
                return None
            
            slow = slow.next
            fast = fast.next.next
        
        fast = head
        while slow != fast:
            slow = slow.next
            fast = fast.next
        
        return slow