【006】Leetcode—双重指针—141. 环形列表(Linked List Cycle)

题目信息

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

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。

示例:

1:

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

2:

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

3:

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

解题思路

        if not head:
            return False
        l1 = head
        l2 = head.next
        while l1 and l2 and l2.next:
            if l1 == l2: 
                return True
            else:
                l1 = l1.next
                l2 = l2.next.next
        else:
            return False

主要思路是设置两个指针,l1增长速率慢,l2增长速率快,这样做是因为我们不知道环在哪里,没法固定其中一个指针来和另一个动态指针进行比较。

如果两个指针重合了,那么说明有环,若l1、l2、l2.next为空,说明指针到头,不存在环。

学习

其他解法:

最开始考虑的是值唯一,但是部分案例没有通过,所以要通过唯一地址去判断是否为环:

        p = head
        result = []
        while p and p.next:
            if p in result:
                return True
            else:
                result.append(p)
            p = p.next

        return False

原理是存地址,然后用单指针p去判断当前地址是否出现过

    原文作者:黄元帅
    原文地址: https://blog.csdn.net/Xiao_Spring/article/details/104462137
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞