目录
一、题目内容
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
说明:不允许修改给定的链表。
示例 1:
输入:head = [3,2,0,-4], pos = 1
输出:tail connects to node index 1
解释:链表中有一个环,其尾部连接到第二个节点。
示例 2:
输入:head = [1,2], pos = 0
输出:tail connects to node index 0
解释:链表中有一个环,其尾部连接到第一个节点。
示例 3:
输入:head = [1], pos = -1
输出:no cycle
解释:链表中没有环。
进阶:
你是否可以不用额外空间解决此题?
二、解题思路
快慢指针,快指针比慢指针多走一倍的距离,如果起始点到入环的节点距离为a,快慢指针相遇的节点与入环的节点的距离为b,则慢指针需要再走a那么长的距离到入环的节点,这个距离和起始点到入环的节点的距离一样,因此当快慢指针相遇时则可以让一个指针从head节点出发,与此同时slow指针依旧向前走,当这两个指针相遇,则相遇的节点就是入环的节点。
三、代码
-
# Definition for singly-linked list.
-
class ListNode:
-
def __init__(self, x):
-
self.val = x
-
self.next = None
-
-
def __repr__(self):
-
return str(self.val)
-
-
class Solution:
-
def detectCycle(self, head: ListNode) -> ListNode:
-
if head is None:
-
return
-
slow = fast = head
-
-
while fast and fast.next:
-
slow = slow.next
-
fast = fast.next.next
-
-
if slow == fast:
-
q = head
-
while q != slow:
-
q = q.next
-
slow = slow.next
-
return q
-
return None
-
-
-
if __name__ == '__main__':
-
-
# head = [3, 2, 0, -4]
-
head = ListNode(3)
-
head.next = ListNode(2)
-
head.next.next = ListNode(0)
-
head.next.next.next = ListNode(-4)
-
head.next.next.next.next = head.next
-
-
s = Solution()
-
ans = s.detectCycle(head)
-
print(ans)
文章来源: nickhuang1996.blog.csdn.net,作者:悲恋花丶无心之人,版权归原作者所有,如需转载,请联系作者。
原文链接:nickhuang1996.blog.csdn.net/article/details/108991215