小白学习[leetcode][快慢指针]之142环形链表 II

题目的链接在这里:
https://leetcode-cn.com/problems/linked-list-cycle-ii/


题目大意

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

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。


一、示意图

在这里插入图片描述

二、解题思路

java实现

在这里插入图片描述

代码如下:

/**
 * 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 slow=head;
        ListNode fast=head;
        boolean isCye=false;
        //这里要先.next.next 防止出现fast存在,.next.next不存在 
        //fast.next不等于null ,但是这样.next.next就可以等于null了
        while (fast!=null&&fast.next!=null){
    
    
            slow=slow.next;
            fast=fast.next.next;
            //并在其中判断两者是否会相交
            if(slow==fast){
    
    
                isCye=true;
                break;
            }
            //否则一直这样下去
        }
        //在判断出有环的情况之下
        if(isCye){
    
    
            //这个时候两个已经相交了
            //画图比较好理解  slow走了a+b的路程,fast走了2(a+b)的路程,所以整个环也是多走的a+b
            //除去A-B的b距离的话,从B走到A 就需要a距离,也就是说slow只需要走a距离,就可以到入口
            //而a距离刚好是从起点到A,以slow的方法走的,所以只需要把fast改成slow的方法,重新从起点出发即可
            fast=head;
            while (fast!=slow){
    
    
                fast=fast.next;
                slow=slow.next;
            }
            return slow;
        }

        return null;

    }    
}

在这里插入图片描述


猜你喜欢

转载自blog.csdn.net/qq_41115379/article/details/114383093