1 題目
給定一個鏈表,判斷鏈表中是否有環。
爲了表示給定鏈表中的環,我們使用整數 pos 來表示鏈表尾連接到鏈表中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該鏈表中沒有環。
2 示例
示例 1:
輸入:head = [3,2,0,-4], pos = 1
輸出:true
解釋:鏈表中有一個環,其尾部連接到第二個節點。
示例 2:
輸入:head = [1,2], pos = 0
輸出:true
解釋:鏈表中有一個環,其尾部連接到第一個節點。
示例 3:
輸入:head = [1], pos = -1
輸出:false
解釋:鏈表中沒有環。
3 分析
將鏈表想象成跑道,將兩個指針想象成跑道上的賽跑的兩個人。如果跑道是環形跑道,假設兩人從起點開始一直跑,那麼速度快的人遲早會追上速度慢的人(套圈)。
雙指針法:我們設置一快一慢兩個指針,如果鏈表中存在環,那麼快指針將會和慢指針指向同一位置。
4 題解
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def hasCycle(self, head):
if not head:
return False
p1 = p2 = head # 定義兩個指針
while p1 and p2 and p2.next:
p1 = p1.next
p2 = p2.next.next # p1 p2 速度不同
if p1 == p2:
return True
return False