题解 | #判断链表中是否有环#

判断链表中是否有环

http://www.nowcoder.com/practice/650474f313294468a4ded3ce0f7898b9

/**
 * 解法一:双指针
 * 思路:
 * (1)设置快慢两个指针,初始都指向链表头。
 * (2)遍历链表,快指针每次走两步,慢指针每次走一步。
 * (3)如果快指针到了链表末尾,说明没有环,因为它每次走两步,所以要验证连续两步是否为 NULL。
 *  (4)如果链表有环,那快慢双指针会在环内循环,因为快指针每次走两步,因此快指针会在环内追到慢指针,二者相遇就代表有环。
 * 时间复杂度: O(n),最坏情况下遍历链表n个节点
 * 空间复杂度: O(1),仅使用了两个指针,没有额外辅助空间
 */
export function hasCycle(head: ListNode | null): boolean {
    if (head == null) return false

    // 快慢双指针
    let fast: ListNode = head
    let slow: ListNode = head

    while (fast != null && fast.next != null) { // 快指针移动两步
        fast = fast.next.next // 慢指针移动一步
        slow = slow.next // 相遇则有环
        if (fast === slow) return true

    }

    return false // 到末尾则没有环
};

/**
 * 解法二:哈希
 * 思路:
 * (1)使用哈希表来存储所有已经访问过的节点。
 * (2)每次我们到达一个节点,如果该节点已经存在于哈希表中,则说明该链表是环形链表,否则就将该节点加入哈希表中。
 * (3)重复这一过程,直到我们遍历完整个链表即可。
 * 时间复杂度: O(n),最坏情况下遍历链表 n 个节点
 * 空间复杂度: O(n),其中 n 是链表中的节点数。主要为哈希表的开销,最坏情况下我们需要将每个节点插入到哈希表中一次。
 */
 export function hasCycle(head: ListNode | null): boolean {
    if (head == null) return false

    const seenMap = new Map()

    while (head != null) {
        if (seenMap.has(head)) return true
        seenMap.set(head, 1)
        head = head.next
    }

    return false
};

一站式解决前端面试高频算法题

https://github.com/hovinghuang/fe-agorithm-interview

全部评论

相关推荐

10-29 22:30
吉林大学 Java
同专业学长学姐,去互联网大厂的起薪 15k+,去国企 IT 岗的也有 12k+,就连去中小厂的都基本 13k 起步😤 我投的传统行业技术岗,拼死拼活拿到 1Woffer,本来还挺开心,结果逛了圈牛客直接破防,同是校招生,行业差距怎么就这么大啊!
喵喵喵6_6:应该哪里不对吧,大厂都是20k以上的,10k那种对于985本的学生基本就是点击一下过了笔试就送的,我前两天刚拿了一个11k,笔试完第2天就打电话了,非科班。坏消息是c++岗开这么低真是刷新认知了
校招生月薪1W算什么水平
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务