快慢指针法,解法比较新颖,需要数学功底。

    1. # 给定一个链表,判断链表中是否有环。
    2. #
    3. # 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
    4. #
    5. #
    6. #
    7. # 示例 1:
    8. #
    9. # 输入:head = [3,2,0,-4], pos = 1
    10. # 输出:true
    11. # 解释:链表中有一个环,其尾部连接到第二个节点。
    12. #
    13. #
    14. #
    15. #
    16. # 示例 2:
    17. #
    18. # 输入:head = [1,2], pos = 0
    19. # 输出:true
    20. # 解释:链表中有一个环,其尾部连接到第一个节点。
    21. #
    22. #
    23. #
    24. #
    25. # 示例 3:
    26. #
    27. # 输入:head = [1], pos = -1
    28. # 输出:false
    29. # 解释:链表中没有环。
    30. #
    31. #
    32. #
    33. #
    34. #
    35. #
    36. # 进阶:
    37. #
    38. # 你能用 O(1)(即,常量)内存解决此问题吗?
    39. # Related Topics 链表 双指针
    40. # 👍 719 👎 0
    41. # leetcode submit region begin(Prohibit modification and deletion)
    42. # Definition for singly-linked list.
    43. # class ListNode(object):
    44. # def __init__(self, x):
    45. # self.val = x
    46. # self.next = None
    47. class Solution(object):
    48. def hasCycle(self, head):
    49. """
    50. :type head: ListNode
    51. :rtype: bool
    52. """
    53. if not head or not head.next:
    54. return False
    55. fast, slow = head, head
    56. while fast:
    57. fast = fast.next
    58. slow = slow.next
    59. if fast:
    60. fast = fast.next
    61. if fast == slow:
    62. return True
    63. return False
    64. # leetcode submit region end(Prohibit modification and deletion)