[LeetCode141题环形链表] | 刷题打卡

734 阅读3分钟

前言

这里是之前的刷题打卡记录,大家有兴趣的可以看下,如果有什么不同的见解和看法或者觉得有什么错误的,欢迎在评论区留言!🙏🙏🙏

[LeetCode0303题区域和检索 - 数组不可变] | 刷题打卡

[LeetCode1200. 最小绝对差] | 刷题打卡

[LeetCode0304题二维区域和检索 - 矩阵不可变] | 刷题打卡

[LeetCode11题盛最多水的容器] | 刷题打卡

[LeetCode0338题比特位计数] | 刷题打卡

[LeetCode209题长度最小的子数组] | 刷题打卡

[LeetCode236题二叉树的最近公共祖先] | 刷题打卡

题目描述

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

如果链表中有某个节点,可以通过连续跟踪 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, 10^4]

  • -10^5 <= Node.val <= 10^5

  • pos 为 -1 或者链表中的一个 有效索引 。

解题思路

给定一个链表,判断链表中是否有环。这不就是链表中快慢指针的经典用法嘛!

把链表比作一条跑道,链表中有环,那么这条跑道就是一条圆环跑道,在一条圆环跑道中,两个人有速度差,那么迟早两个人会相遇,只要相遇那么就说明有环。

我们设定fast、slow两个指针跑进了环head里,那么因为存在速度差,他们之间的距离总会由远及近,然后相遇,在远离。像极了我们人世间某些人在你生命中匆匆而过的感觉。

快慢指针中,因为每一次移动后,快指针都会比慢指针多走一个节点,所以他们之间在进入环状链表后,不论相隔多少个节点,慢指针总会被快指针赶上并且重合,此时就可以判断必定有环。

解题代码

/**
* Definition for singly-linked list.
* function ListNode(val) {
*     this.val = val;
*     this.next = null;
* }
*/

/**
* @param {ListNode} head
* @return {boolean}
*/
var hasCycle = function(head) {
   let fast = head
   let slow = head
   while(fast) {
       if (fast.next == null) return false
       slow = slow.next
       fast = fast.next.next
       if (slow == fast) return true
   }
   return false
};

我在这道题的题解板块看到一个我觉得巧用js的解法,分享给大家看下:

var hasCycle = function(head) {
   try {
       JSON.stringify(head)
       return false
   } catch {
       return true
   }
};

这个解法就是利用了

JSON.stringify当在循环引用时会抛出异常TypeError ("cyclic object value")(循环对象值)

我怎么就没想到呢!!!

总结

多写写题解还是很有必要的,不要怕写的不好,敢写就已经很不错了,写的过程就是回顾的过程,更容易加深自己的理解。

加油!hxdm!!!💪💪💪

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情