美文网首页
链表是否有环

链表是否有环

作者: dalewong | 来源:发表于2021-10-20 15:37 被阅读0次

https://leetcode-cn.com/problems/linked-list-cycle/submissions/
判断链表是否有环 可以使用hashmap来存储是否之前有过
但是由于题目要求只能o1的空间复杂度
所以使用快慢指针来处理该问题

需要注意的几点corner case,fast及slow node可能为空
如果有环则slow会追上fast, 如果没有的话fast.next为空节点.

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def hasCycle(self, head: ListNode) -> bool:
        slow = head
        if not slow:
            return False
        fast = head.next

        if not (fast and fast.next):
            return False

        while slow != fast and fast and fast.next is not None:
            slow = slow.next
            fast = fast.next.next
        
        if slow == fast:
            return True
        else:
            return False

https://leetcode-cn.com/problems/linked-list-cycle-ii/
获取环形链表的交叉位置,一样o1的空间复杂度
这里需要用一点证明
假设从最开始到交点的距离为x, fast和slow交点为y, 环剩下的距离为z
因为fast的速度是slow的一倍,所以fast的路径长度为slow的的一倍
(x + y)* 2 = x + n(y + z) + y
左右都去掉一个x + y, 则可得 x + y = n(y + z)
x = (y + z)n - y
x = (n-1)(y+z) + z
由于我们知道y+z为一圈,所以从相交点走z和从头开始走x相遇的地方就位环的相交点

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def detectCycle(self, head: ListNode) -> ListNode:
        current = fast = slow = head
        if not (fast and fast.next):
            return 
        
        # 这里因为slow和fast一样 所以需要先slow和fast都走一步再循环往前走
        fast = fast.next.next
        slow = slow.next
        while fast != slow and fast and fast.next:
            fast = fast.next.next
            slow = slow.next
        
        if fast != slow:
            return
        
        while current != fast:
            current = current.next
            fast = fast.next
        
        return current

相关文章

  • 检测链表有环

    题目:如何判断一个单链表是否有环?若有环,如何找出环的入口节点。 一、单链表是否有环 思路分析: 单链表有环,是指...

  • 常见的面试算法题

    判断链表是否有环

  • 链表算法

    定位链表中间节点 链表反转 链表是否有环, 返回的是环的位置,0代表没有环

  • 2022-02-27环形链表linked-list-cycle

    1.判断单链表是否有环 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续...

  • 其余代码题

    链表是否有环-done 表达式计算-done 括号匹配-done 最长有效括号长度 链表是否有环 提示:快慢指针 ...

  • 141. 环形链表

    给定一个链表,判断链表中是否有环。

  • 141.环形链表

    给定一个链表,判断链表中是否有环。

  • 链表是否有环

    给定一个链表,判断链表中是否有环。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索...

  • 链表是否有环

    https://leetcode-cn.com/problems/linked-list-cycle/submis...

  • 链表是否有环

    题目介绍 链表是否有环,有则返回入环的第一个结点,无环则返回null 代码实现

网友评论

      本文标题:链表是否有环

      本文链接:https://www.haomeiwen.com/subject/wdmxrktx.html