[Top 101 entrevistas imprescindibles] El nodo de entrada del anillo en la lista vinculada y los últimos k nodos en la lista vinculada

Tabla de contenido

Tema: El nodo de entrada del enlace en la lista vinculada_Niuke Pregunta Ba_Niuke.com (nowcoder.com)

Interfaz de preguntas:

Ideas para resolver problemas:

Código:

¡Aprobado! ! !

Tema: Los últimos k nodos en la lista vinculada_Niuke Tema_Niuke.com (nowcoder.com)

Interfaz de preguntas:

Ideas para resolver problemas:

Código:

¡Aprobado! ! !

Escribe al final:


Tema: El nodo de entrada del enlace en la lista vinculada_Niuke Pregunta Ba_Niuke.com (nowcoder.com)

Interfaz de preguntas:

package main

func EntryNodeOfLoop(pHead *ListNode) *ListNode {
    
}

Ideas para resolver problemas:

Hay un punto clave en esta pregunta. No lo sabía cuando lo hice por primera vez, pero después de hacerlo una vez, supe cómo hacerlo. En teoría, debería haber una prueba matemática, pero no lo soy. Bueno en matemáticas, así que no sé cómo hacerlo. Lo probaré.

Punto clave: la distancia desde el nodo principal hasta la posición de entrada == la distancia desde la posición de intersección de los punteros rápido y lento hasta la posición de entrada, simplemente escriba el código de acuerdo con esta regla.

Código:

package main

func EntryNodeOfLoop(pHead *ListNode) *ListNode {
    fast := pHead
    slow := pHead

    // 找到快慢指针相交的位置
    for fast != nil && fast.Next != nil {
        fast = fast.Next.Next
        slow = slow.Next
        if fast == slow {
            break
        }
    }

    // 头结点到入口位置的距离 == 快慢指针相交位置到入口位置的距离
    for fast != nil && pHead != nil && pHead.Next != nil {
        if fast == pHead {
            return fast
        }
        fast = fast.Next
        pHead = pHead.Next
    }
    
    return nil
}

¡Aprobado! ! !

Tema: Los últimos k nodos en la lista vinculada_Niuke Tema_Niuke.com (nowcoder.com)

Interfaz de preguntas:

package main
import . "nc_tools"
/*
 * type ListNode struct{
 *   Val int
 *   Next *ListNode
 * }
 */

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param pHead ListNode类 
 * @param k int整型 
 * @return ListNode类 
*/
func FindKthToTail( pHead *ListNode ,  k int ) *ListNode {
    // write code here
}

Ideas para resolver problemas:

Cuando vi esta pregunta por primera vez, pensé en una solución de fuerza bruta: primero atravesar violentamente la longitud de la lista vinculada y luego interceptar los últimos k nodos según la longitud de k. Sin embargo, la fuerza bruta definitivamente no es la solución óptima. Entonces comencé a pensar en cómo optimizarlo.

Una idea de optimización relativamente simple son los punteros rápido y lento. La idea central es: dejar que el puntero rápido avance k pasos primero y luego dejar que los dos punteros retrocedan juntos. Cuando el puntero rápido llega a cero, el puntero lento está en el k-ésimo posición desde abajo, porque el puntero rápido y el puntero lento están separados por k posiciones.

Código:

package main
import . "nc_tools"
/*
 * type ListNode struct{
 *   Val int
 *   Next *ListNode
 * }
 */

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param pHead ListNode类 
 * @param k int整型 
 * @return ListNode类 
*/
func FindKthToTail( pHead *ListNode ,  k int ) *ListNode {
    fast := pHead
    slow := pHead

    for i := 0; i < k; i++ {
        if fast == nil {
            return nil
        }
        fast = fast.Next
    }

    for fast != nil {
        fast = fast.Next
        slow = slow.Next
    }

    return slow
}

¡Aprobado! ! !

Escribe al final:

Ese es el contenido de este artículo, gracias por leer.

Si crees que has ganado algo, puedes darle un me gusta al blogger .

Si hay omisiones o errores en el contenido del artículo, envíe un mensaje privado al blogger o indíquelo en el área de comentarios ~

Supongo que te gusta

Origin blog.csdn.net/Locky136/article/details/132868721
Recomendado
Clasificación