LeetCode142 Pregunta: Circular Linked List II Dada una lista vinculada, devuelva el primer nodo donde la lista vinculada comienza a entrar en el anillo. Si la lista vinculada no tiene anillos, se devuelve un valor nulo.

  1. Circular Linked List II
    Dada una lista vinculada, devuelva el primer nodo donde la lista vinculada comienza a entrar en el anillo. Si la lista vinculada no tiene anillos, se devuelve un valor nulo.

Para representar los anillos en una lista vinculada dada, usamos el entero pos para indicar la posición donde el final de la lista vinculada está conectado a la lista vinculada (el índice comienza desde 0). Si pos es -1, no hay anillos en la lista vinculada. Tenga en cuenta que pos solo se utiliza para identificar el anillo y no se pasará a la función como parámetro.

Nota: No está permitido modificar la lista vinculada dada.

Avanzado:

¿Puedes resolver este problema usando el espacio O (1)?

Ejemplo 1:
Inserte la descripción de la imagen aquí

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

Ejemplo 2:
Inserte la descripción de la imagen aquí

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

Ejemplo 3:
Inserte la descripción de la imagen aquí

输入:head = [1], pos = -1
输出:返回 null
解释:链表中没有环。
 
提示:

链表中节点的数目范围在范围 [0, 104] 
-105 <= Node.val <= 105
pos 的值为 -1 或者链表中的一个有效索引

Código:

/**
 * 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) {
    
    
        if(head == null){
    
    //判断链表是否为空
            return null;
        }
        ListNode fast = head;
        ListNode slow = head;

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

            fast= fast.next.next;//fsat每次走两步的原因是走两步在最快的情况下可以遇到
            slow = slow.next;

            if(fast == slow){
    
    //相遇时说明有环
                break;
            }
        }
        if(fast == null || fast.next == null) {
    
    
            return null;//循环结束,fast和slow还没遇到说明链表无环
        }
        //代码走到这说明有环,并且slow和fast相遇了
        slow = head;//slow从头开始走
        while(slow != fast) {
    
    
            fast = fast.next;//fast从相遇的地方开始走
            slow = slow.next;
        }
         return fast;//此时相遇时就是入环的第一个节点,返回slow或者fast
    }
}

resultado:
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_44436675/article/details/112727638
Recomendado
Clasificación