leetcode_142. 环形链表 II

目录

一、题目内容 

二、解题思路

三、代码


一、题目内容 

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 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指针依旧向前走,当这两个指针相遇,则相遇的节点就是入环的节点。

三、代码


  
  1. # Definition for singly-linked list.
  2. class ListNode:
  3. def __init__(self, x):
  4. self.val = x
  5. self.next = None
  6. def __repr__(self):
  7. return str(self.val)
  8. class Solution:
  9. def detectCycle(self, head: ListNode) -> ListNode:
  10. if head is None:
  11. return
  12. slow = fast = head
  13. while fast and fast.next:
  14. slow = slow.next
  15. fast = fast.next.next
  16. if slow == fast:
  17. q = head
  18. while q != slow:
  19. q = q.next
  20. slow = slow.next
  21. return q
  22. return None
  23. if __name__ == '__main__':
  24. # head = [3, 2, 0, -4]
  25. head = ListNode(3)
  26. head.next = ListNode(2)
  27. head.next.next = ListNode(0)
  28. head.next.next.next = ListNode(-4)
  29. head.next.next.next.next = head.next
  30. s = Solution()
  31. ans = s.detectCycle(head)
  32. print(ans)

文章来源: nickhuang1996.blog.csdn.net,作者:悲恋花丶无心之人,版权归原作者所有,如需转载,请联系作者。

原文链接:nickhuang1996.blog.csdn.net/article/details/108991215

(完)