劍指offer24 — 鏈表中環的入口結點
題目
給一個鏈表,若其中包含環,請找出該鏈表的環的入口結點,否則,輸出null。
分析
-
什麼是環?
-
判斷是否有環的想法1:空間換時間
走一個加一個到set裏面,有重複就說明是環。 -
快慢指針:
-
先判斷是否有環(判斷是否有環的想法2):
快指針走到none,則沒環。
快指針和慢指針相遇,則有環。
-
快走2慢走1時,快慢必相遇,相遇時經推導有:
開頭至環入口的距離s = 相遇點至環入口距離m + (n-1)*(相遇點至環入口距離m+環入口至相遇點距離d )
-
解
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def EntryNodeOfLoop(self, pHead):
# write code here
# 快慢指針,循環跳
if pHead == None or pHead.next == None:
return None
fastPointer = pHead
slowPointer = pHead
while fastPointer and fastPointer.next:
fastPointer=fastPointer.next.next
slowPointer = slowPointer.next
if fastPointer == slowPointer:
break
fastPointer = pHead
while fastPointer != slowPointer:
fastPointer = fastPointer.next
slowPointer = slowPointer.next
return fastPointer