Leetcode141题:环形链表

198 阅读1分钟

141题:环形链表
方法一:数组

思路: 1. 遍历每个值,每个值及每个值的.next 不能为null 2. 把每一项值与数组中的值进行对比是否相等,有相等的返回true,说明是环形链表;否则把该值存入数组中

复杂度: 时间复杂度:O(n^2) 空间复杂度:O(n)

代码:

var hasCycle = function(head) {
    let p = head
    let stack = []
    while(p && p.next){
        for(let i = 0;i<stack.length;i++){
            if(stack[i] == p){
                return true
            }
        }
        stack.push(p)
        p=p.next
    }
    return false
};

方法二: 快慢指针
原理: 龟兔赛跑原理(快慢指针原理) 众所周知,🐰比🐢跑的慢,他们位于同一起跑点开始跑,如果不是环形链表,那么🐰永远在🐢前面。如果是环形链表,那么当🐰领先🐢很多圈的时候,某一点🐰和🐢会相遇。那么在这一点判断值是否相等,相等则为环形链表。也称为快慢指针,定义两个指针,一个是快指针代表🐰,一个是慢指针🐢。

复杂度: 时间复杂度:O(n) 空间复杂度: O(1)

代码:

var hasCycle = function(head){
    let slow = head
    let fast = head
    while(fast && fast.next){
        slow = slow.next
        fast = fast.next.next
        if(slow === fast){
            return true
        }
    }
    return false
}