0141-leetcode算法实现之环形链表-linked-list-cycle-python&golang实现

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

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

如果链表中存在环,则返回 true 。 否则,返回 false 。

进阶:

你能用 O(1)(即,常量)内存解决此问题吗?

示例 1:

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
示例 2:

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。
示例 3:

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

提示:

链表中节点的数目范围是 [0, 104]
-105 <= Node.val <= 105
pos 为 -1 或者链表中的一个 有效索引 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/linked-list-cycle

python

# 141.环形链表

class ListNode:
    def __init__(self, val):
        self.val = val
        self.next = None

class Solution:
    def hasCycle(self, head: ListNode) -> bool:
        """
        双指针, 快慢指针, 时间O(n), 空间O(1)
        思路:
        - 初始化slow,fast快慢指针
        - fast走2步,slow走1步
        - 有环时,fast一定会和slow相遇
        - 无环时,fast一定先走到None
        :param head:
        :return:
        """
        slow, fast = head
        while fast != None:
            fast = fast.next
            if fast != None:
                fast = fast.next
            if fast == slow:
                return True
            slow = slow.next
        return False

golang

// 双指针之快慢指针,有环必相交
func hasCycle(head *ListNode) bool {
	slow, fast := head, head
	for fast != nil {
		fast = fast.Next
		if fast != nil {
			fast = fast.Next
		}
		if fast == slow {
			return true
		}
		slow = slow.Next
	}
	return false
}

posted on 2021-11-03 23:03  进击的davis  阅读(26)  评论(0编辑  收藏  举报

导航