【切图仔的算法修炼之旅】LeetCode141:判断链表是否有环

简介: 【切图仔的算法修炼之旅】LeetCode141:判断链表是否有环

一、题目描述


给你一个链表的头节点 head ,判断链表中是否有环。


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


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


示例1:


image.png


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


示例2:


image.png


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


提示:


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


二、思路分析


这一道题目还是比较考验你的思维能力的,有三种做法


  1. 第一种做法就是暴力解法,一直循环next,看是否能结束循环,当然这种解法性能一定很差,我们肯定是不推荐的。
  2. 第二种做法就是使用Set数据结构,遍历到的每个节点将他存起来,Set数据结构的特性就是一组唯一值的集合,关于它的更多的信息可以查看MDN-JavaScript标准内置对象-Set,wow,MDN居然有了新的文档!!!。该做法的时间复杂度是O(n * 1) = O(n)
  3. 第三种做法就是龟兔赛跑的解法,也就是使用快慢指针,快指针走2步,慢指针走一步,如果链表没有环,那么它们一定不会走到同一节点,如果链表有环,那么它们将会一定相遇,当然这种解法可能比较反人类,比较难想到。该做法的时间复杂度也是O(n)


三、AC代码


  1. Set数据结构解法


const hasCycle = function(head) {
    const visited = new Set()
    while(head) {
        if(visited.has(head)) {
            return true
        }
        visited.add(head)
        head = head.next
    }
    return false
};
复制代码


  1. 龟兔赛跑解法


var hasCycle = function(head) {
   let p1 = head, p2 = head
   while (p1 && p2.next && p2.next.next) {
     p1 = p1.next
     p2 = p2.next.next
     if (p1 === p2) {
       return true
     }
   }
   return false
};
复制代码


四、总结


这题在思维上还是有一点的,我们推荐使用后面两种解法,Set解法是比较中规中举的解法,龟兔赛跑解法比较反人类,可能你很难想到,它相比于Set解法更加节省内存,因为你不用将每个节点存起来,如果你能在面试的时候能想到这三种解法,那你一定会在面试官面前眼前一亮。

相关文章
|
2月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
38 1
|
2月前
Leetcode第21题(合并两个有序链表)
这篇文章介绍了如何使用非递归和递归方法解决LeetCode第21题,即合并两个有序链表的问题。
52 0
Leetcode第21题(合并两个有序链表)
|
1月前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
2月前
|
算法
每日一道算法题(Leetcode 20)
每日一道算法题(Leetcode 20)
35 2
|
2月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
28 0
LeetCode第二十四题(两两交换链表中的节点)
|
2月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
47 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
2月前
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
96 0
|
2月前
【LeetCode 10】142. 环形链表 II
【LeetCode 10】142. 环形链表 II
23 0
|
2月前
【LeetCode 09】19 删除链表的倒数第 N 个结点
【LeetCode 09】19 删除链表的倒数第 N 个结点
18 0
|
2月前
【LeetCode 08】206 反转链表
【LeetCode 08】206 反转链表
13 0