链表-环形链表||
文章目录
- 142.环形链表||
142.环形链表||
题目链接:
142.环形链表||
题目描述:
给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。不允许修改 链表。
提示:链表中节点的数目范围在范围 [0, 104] 内
-105 <= Node.val <= 105
pos 的值为 -1 或者链表中的一个有效索引
核心代码:
/*** Definition for singly-linked list.* class ListNode {* int val;* ListNode next;* ListNode(int x) {* val = x;* next = null;* }* }*/
public class Solution {public ListNode detectCycle(ListNode head) {ListNode fast = head;//快指针ListNode slow = head;//慢指针;ListNode index1;//记录相遇的时候的指针;ListNode index2=head;//记录开始的位置的指针while(fast!=null&&fast.next!=null){//因为fast每次都得走两步,所以循环条件要有两步判断的都不为空fast = fast.next.next;//快指针走两步;slow = slow.next;//慢指针走一步;if(slow == fast){//快慢指针相遇了,说明有环。有环了之后我们要找入口,根据推到x=z;index1 = fast;//记录一下相遇的位置;index2 = head;//从头开始while(index1!=index2){//只要他俩不相等,就是没有相遇,我们就一直走index1 = index1.next;index2 = index2.next;}//循环结束的时候我们找到了入口:return index1;//return index2也行,都一样,因为循环结束的时候他们指向的是同一位置。}}return null;//如果程序没走if证明没有环,返回空。}
}
思路: