我参与11月更文挑战的第26天,活动详情查看:2021最后一次更文挑战
回顾
我们回顾一下141 链表中是否有环。
思路一 :hash表
我们通过hash表来存储遍历过的值,如果遍历的值在hash表里存在了就说明链表里有环,跳出循环,否则循环结束时,返回false,说明链表无环。
var hasCycle = function(head) {
let cur = head, table = new Set()
while(cur){
if(table.has(cur))return true
table.add(cur)
cur = cur.next
}
return false
};
思路二 :快慢指针
我们通过slow , fast快慢指针,slow走一步,fast走两步,当slow==fast,节点相遇,说明有环,否则没有。
var hasCycle = function(head) {
let slow = head, fast = head // 声明快慢指针
while(fast && fast.next){
if(slow == fast)return true // 指针相遇了表示有环
slow = slow.next
fast = fast.next.next // 判断fast.next存在的原因是 fast走两步,防止fast.next为空报错
}
return false
};
142. 环形链表 II
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。
不允许修改 链表。
这里同样遵循
141的解法
思路一 :hash表
我们通过hash表来存储遍历过的值,如果遍历的值在hash表里存在了就说明这里是入环的起始点,并返回这个节点,跳出循环。否则循环结束时,返回null,说明链表无环。
var detectCycle = function(head) {
let cur = head, table = new Set()
while(cur){
if(table.has(cur))return cur
table.add(cur)
cur = cur.next
}
return null
};
思路二 :快慢指针
我们通过slow , fast快慢指针,slow走一步,fast走两步,当slow==fast,节点相遇
这里我们需要看一张图
var detectCycle = function(head) {
let slow = head, fast = head // 声明快慢指针
while(fast && fast.next){
slow = slow.next
fast = fast.next.next // 判断fast.next存在的原因是 fast走两步,防止fast.next为空报错
if(slow == fast) {// 指针相遇了表示有环
let start = head
while(slow != start){
start = start.next
slow = slow.next
}
return slow
}
}
return null // 无环则返回null
};
结束语
如果您喜欢我的文章,可以[关注⭐]+[点赞👍]+[评论📃],您的三连是我前进的动力,期待与您共同成长~