在前面一篇博客提到如何判断单向链表有环的方法,主要有两种:
1. set集合判断
2. 双指针法(一个走一步,一个走两步,如果有环总会碰到)
这篇博客接着上一篇博客,解决leetcode142——返回有环单向链表的入环节点
显然set集合同样可以解决该问题,但是需要耗费O(n)的空间复杂度,如果需要寻找更优的时间复杂度,则需要对以上的双指针法进一步改进和分析。
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def detectCycle(self, head: ListNode) -> ListNode:
# 双指针解决不了 双指针碰到的地方不一定是有环节点 还是得需要用set集合
# 双指针能够解决,只是我解决不了(笑死),学习一下大家的双指针法,分析很重要!!! respect!
# set集合法
'''
if not head:
return None
s = set()
while head:
if head in s:
return head
s.add(head)
head = head.next
return None
'''
'''
不要把一个问题看死,正如老师所说的
'''
if not head:
return None
fast = head
slow = head
# 找到第一次相遇的地方 slow = nb fast = 2nb
while fast and fast.next:
slow = slow.next
fast = fast.next.netx
if slow==fast:
break
# 把fast置成head fast和slow一步一步走a步时(相遇) ,slow指向入环节点
fast = head
while fast!=slow:
fast = fast.next
slow = slow.next
return slow