leetcode_142. 环形链表 II

举报
悲恋花丶无心之人 发表于 2021/02/03 00:17:40 2021/02/03
【摘要】 目录 一、题目内容  二、解题思路 三、代码 一、题目内容  给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 说明:不允许修改给定的链...

目录

一、题目内容 

二、解题思路

三、代码


一、题目内容 

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 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

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。