Introducción

1

¿Ya tomaste el Curso Avanzado de Algoritmos: Patrones de Arrays y Strings?

Lista Enlazada

2

Estructura de datos: Lista Enlazada

3

Programando listas enlazadas con Java

4

Cómo Invertir una Lista Enlazada

5

Odd Even Linked List: análisis del problema

6

Solución de Odd Even Linked List

7

Playground: Odd Even Liked List

8

Programando Odd Even Linked List con C++

9

Linked List Cycle: análisis del problema

10

Solución de Linked List Cycle

11

Playground: Linked List Cycle

12

Programando Linked List Cycle con Python

13

Palindrome Linked List: análisis del problema

14

Solución de Palindrome Linked List

15

Playground: Palindrome Linked List

16

Programando Palindrome Linked List con Java

17

Reorder List: análisis del problema

18

Solución de Reorder List

19

Programando Reorder List con JavaScript

20

Playground: Reorder List Without Repeated Values

21

Reto: LRU Caché

22

Ejercicios recomendados de Lista Enlazada

23

Ejercicios resueltos de Lista Enlazada

Pilas y colas

24

Estructura de datos: Pilas y Colas

25

Paréntesis Válido: análisis del problema

26

Solución de Paréntesis Válido

27

Playground: Paréntesis Válido

28

Programando Paréntesis Válido con C++

29

Ejercicios recomendados de Pilas

Colas de prioridad

30

Estructura de datos: Colas de Prioridad

31

K Closest Points to Origin: análisis del problema

32

Solución de K Closest Points to Origin

33

Playground: K Closest Points to Origin

34

Programando K Closest Points to Origin con Python

35

Reorganize String: análisis del problema

36

Solución de Reorganize String

37

Playground: Reorganize String

38

Programando Reorganize String con Python

39

Ejercicios recomendados de Colas de prioridad

40

Ejercicios resueltos de Colas de prioridad

Próximos pasos

41

Toma el Curso Avanzado de Algoritmos: Grafos y Árboles

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Solución de Palindrome Linked List

14/41
Recursos

Aportes 5

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Esto si es enseñar lógica, tremendo. Aunque esperaba mejor Big O, aunque sea la misma Big O realmente si hace menos interacción, haciéndolo más óptimo. Interesante.

🤯🤯🤯 que dicha que vi la clase porque no se me hubiera ocurrido en medio de una entrevista
solución en typescript: ``` import { ListNode } from "./ListNode"; function isPalindrome(*head*: ListNode | null): boolean { if (!*head* || !*head*.next) return true; let slow = *head*; let fast = *head*; while (fast !== null && fast.next !== null) { slow = slow.next!; fast = fast.next.next!; } let prev: ListNode | null = null; let current = slow; *//\* reversing the second half of the list* while (current !== null) { let nextNode = current.next; current.next = prev; prev = current; current = nextNode!; } let firstHalf = *head*; let secondHalf = prev; while (secondHalf !== null) { if (firstHalf.val !== secondHalf.val) { return false; } firstHalf = firstHalf.next!; secondHalf = secondHalf.next!; } return true;}; const listNode: ListNode = new ListNode(1, new ListNode(2, new ListNode(2, new ListNode(1))));*//\* \[1,2,2,1] -> true*const listNode2: ListNode = new ListNode(1, new ListNode(2));*//\* \[1,2] -> false* console.log(isPalindrome(listNode));console.log(isPalindrome(listNode2)); ```
Esta es mi solución: ![](https://static.platzi.com/media/user_upload/imagen-4338b081-f6ad-4d7f-b460-fb374a284168.jpg) ![](https://static.platzi.com/media/user_upload/imagen-791f87a3-5e2f-4af9-9dfe-8cdccc5c53f9.jpg)

Estaba pensando que el “reversar” los nodos de la segunda mitad puede llegar a ser complejo. Una solución que yo creo pudiera ser un poco más sencillas es la siguiente:

  • Utilizar los dos apuntadores (rápido y lento) hasta llegar a la mitad de la lista enlazada
  • Por cada nuevo nodo del apuntador lento, se estaría llenando un array, donde cada nuevo elemento se inserta al inicio de este array. En el caso del ejemplo, el array empieza como [1] y a la segunda iteración [9,1]
  • Una vez que se haya llegado a la mitad, el apuntador rápido comienza a actuar de la misma manera que el lento (avanzando un nodo a la vez) y el lento deja de avanzar.
  • El apuntador rápido (que ya esta actuando como el lento) compara su nuevo valor con el del array creado por el del apuntador lento. De esta manera cuando algún valor no coincida, sabremos que no es un palindromo.

.
Creo que esta podría ser una solución más sencilla, aunque claramente sería más costosa en términos de Complejidad Espacial, ya que la solución que yo propongo tendría:

  • Complejidad espacial de O(n)
  • Complejidad temporal de O(n)

.
Mientras que la solución propuesta en la clase tendría

  • Complejidad espacial de O(1)
  • Complejidad temporal de O(n)

.
De cualquier forma creo que es un tradeoff que vale la pena tomar