劍指offer24 --- 鏈表中環的入口結點

劍指offer24 — 鏈表中環的入口結點

題目

給一個鏈表,若其中包含環,請找出該鏈表的環的入口結點,否則,輸出null。

分析

  1. 什麼是環?
    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-FByRb83v-1589030461581)(鏈表中環的入口結點.assets/1589026481567.png)]

  2. 判斷是否有環的想法1:空間換時間
    走一個加一個到set裏面,有重複就說明是環。

  3. 快慢指針:

    1. 先判斷是否有環(判斷是否有環的想法2):

      ​ 快指針走到none,則沒環。

      ​ 快指針和慢指針相遇,則有環。

    2. 快走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

牛客網該題鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章