前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >141. 环形链表

141. 环形链表

作者头像
chuckQu
发布2022-08-19 14:48:57
2130
发布2022-08-19 14:48:57
举报
文章被收录于专栏:前端F2E

141. 环形链表

力扣题目链接

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

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

示例1:

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

提示:

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

进阶:

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

思路:

判断链表有环的问题,可以采用快慢指针的方法来解决。我们规定快指针每次移动两步,慢指针每次移动一步,如果链表有环,那么两个指针终将相遇,此时返回true。如果链表没环,当快指针走到链表末尾时,直接返回false

因为只需要维护两个指针变量,因此空间复杂度是O(1)

下面是完整代码:

快慢指针

代码语言:javascript
复制
/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */

/**
 * @param {ListNode} head
 * @return {boolean}
 */
var hasCycle = function(head) {
    if (!head || !head.next) return false;
    let fast = head.next.next;
    let slow = head.next;
    while(fast !== slow) {
        if (!fast || !fast.next) return false;
        fast = fast.next.next;
        slow = slow.next;
    }
    return true;
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

投机取巧

本题还可以采用JSON的一个特性求解,就是如果对象中存在循环引用,那么执行JSON.stringify()会报错。我们可以通过是否可以捕获到错误来判断是否有环。代码如下:

代码语言:javascript
复制
/**
 * @param {ListNode} head
 * @return {boolean}
 */
var hasCycle = function(head) {
    let flag = false;
    try {
        JSON.stringify(head);
    } catch {
        flag = true;
    }
    return flag;
};

当然在平常的面试或者工作中,不要使用此方法来求解。

总结

本题考查快慢指针的应用,难度系数简单。需要注意的是,要处理边界情况,防止获取undefinednext属性,从而导致报错。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端F2E 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 141. 环形链表
    • 快慢指针
      • 投机取巧
        • 总结
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档