题目
方法一:龟兔赛跑
- 如果真有环,那兔子肯定会和乌龟相遇,当然,兔子的速度肯定要比龟的快,这样才能有交集
- 其实还是快慢指针的原理
class Solution:
def hasCycle(self, head: ListNode) -> bool:
if not head or not head.next:
return False
slow = head
fast = head.next
while slow != fast:
if not fast or not fast.next:
return False
slow = slow.next
fast = fast.next.next
return True
复杂度分析
- 空间复杂度为 O ( 1 ) O(1) O(1)
- 时间复杂度的计算就有点意思了,是
O
(
N
)
O(N)
O(N),
N
N
N是链表节点的个数
- 设龟兔运动 k k k次后相遇,则有: s 兔 − s 龟 = n N s_兔-s_龟=nN s兔−s龟=nN而 s 兔 = 2 k + 1 , s 龟 = k s_兔 = 2k+1,s_龟=k s兔=2k+1,s龟=k n n n是跑过的环的圈数
- 所以就有 k + 1 = n N k+1=nN k+1=nN,这里的 n n n让它取1,就得到 k = N − 1 k=N-1 k=N−1
- 所以还挺有意思的,最多只要N-1次就能让龟兔相遇,所以时间复杂度是 O ( N ) O(N) O(N)
哈希表的方法
class Solution:
def hasCycle(self, head: ListNode) -> bool:
seen = set()
while head:
if head in seen:
return True
seen.add(head)
head = head.next
return False
- 真没想到,set()函数也能用来设定哈希表
- 这样的好处是,不用设value值