题目信息
给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
示例:
1:
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
2:
输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。
3:
输入:head = [1], pos = -1
输出:false
解释:链表中没有环。
解题思路
if not head:
return False
l1 = head
l2 = head.next
while l1 and l2 and l2.next:
if l1 == l2:
return True
else:
l1 = l1.next
l2 = l2.next.next
else:
return False
主要思路是设置两个指针,l1增长速率慢,l2增长速率快,这样做是因为我们不知道环在哪里,没法固定其中一个指针来和另一个动态指针进行比较。
如果两个指针重合了,那么说明有环,若l1、l2、l2.next为空,说明指针到头,不存在环。
学习
其他解法:
最开始考虑的是值唯一,但是部分案例没有通过,所以要通过唯一地址去判断是否为环:
p = head
result = []
while p and p.next:
if p in result:
return True
else:
result.append(p)
p = p.next
return False
原理是存地址,然后用单指针p去判断当前地址是否出现过