Day12:代码随想录算法训练营|141.环形链表1 142.环形链表2

104 阅读3分钟

highlight: a11y-dark theme: smartblue

theme: smartblue highlight: an-old-hope

链表相应题目练习

141.环形链表1

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

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

如果链表中存在环 ,则返回 true 。 否则,返回 false 。

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

对应题目链接:leetcode.cn/problems/li…

1.环形链表1需要解决的问题,判断有没有环

算法:环形链表1

可以使用快慢指针法,分别定义 fast 和 slow 指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。

看动图更加易于理解 tva1.sinaimg.cn/large/008eG…

代码实现

public class Solution {

public boolean hasCycle(ListNode head) {

ListNode fast=head;

ListNode slow=head;

while(fast!=null&&fast.next!=null){

fast=fast.next.next;

slow=slow.next;

if(slow==fast){

return true;

}

}

return false;

}

}

思考

为什么fast 走两个节点,slow走一个节点,有环的话,一定会在环内相遇呢,而不是永远的错开呢?

首先第一点:fast指针一定先进入环中,在环里转圈,慢指针也进入这个圈,如果fast指针和slow指针相遇的话,一定是在环中相遇,这是毋庸置疑的。

快指针一定可以相遇到慢指针吗?

快指针每次走两个节点

慢指针每次走两个节点

相当于慢指针,快指针的速度是每次移动一个节点去靠近慢指针,所以一定会相遇

对应文章讲解: programmercarl.com/0142.%E7%8E…

142.环形链表2

题目:给定一个链表的头节点  head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

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

输入: head = [3,2,0,-4], pos = 1
输出: 返回索引为 1 的链表节点
解释: 链表中有一个环,其尾部连接到第二个节点。

对应题目链接:leetcode.cn/problems/li…

1.环形链表2所要解决的问题:在有环的基础上,找到这个环的入口

算法:环形链表2

可以使用快慢指针法,分别定义 fast 和 slow 指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。有环的前提下找入口

如何找入口

IMG_7113.JPG

IMG_7113.JPG

008eGmZEly1goo58gauidg30fw0bi4qr.gif

那么 n如果大于1是什么情况呢,就是fast指针在环形转n圈之后才遇到 slow指针。

其实这种情况和n为1的时候 效果是一样的,一样可以通过这个方法找到 环形的入口节点,只不过,index1 指针在环里 多转了(n-1)圈,然后再遇到index2,相遇点依然是环形的入口节点。

代码实现

public class Solution {

public ListNode detectCycle(ListNode head) {

ListNode fast=head;

ListNode slow=head;

while(fast!=null&&fast.next!=null){

fast=fast.next.next;

slow=slow.next;

if(fast==slow){

ListNode index1=fast;

ListNode index2=head;

while(index1!=index2){

index1=index1.next;

index2=index2.next;

}

return index1;

}

}

return null;

}

}

对应视频链接:www.bilibili.com/video/BV1if…

总结

找到环的入口点数学理论非常的重要。