【Lintcode】 223. Lista enlazada de Palindrome

Dirección del título:

https://www.lintcode.com/problem/palindrome-linked-list/description

Determine si la lista vinculada es un palíndromo.

La idea es encontrar primero el punto medio de la lista vinculada, luego voltear la mitad de la lista vinculada y finalmente juzgar si las dos listas vinculadas son iguales (el problema de paridad debe considerarse en detalle). El código es el siguiente:

public class Solution {
    /**
     * @param head: A ListNode.
     * @return: A boolean.
     */
    public boolean isPalindrome(ListNode head) {
        // write your code here
        ListNode dummy = new ListNode(0), slow, fast;
        dummy.next = head;
        slow = fast = dummy;
        // 寻找链表的后半部分的头结点(如果有奇数个节点,则找中间节点的后一个节点)
        while (fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;
        }
        ListNode l2 = slow.next;
        slow.next = null;
        return equal(head, reverse(l2));
    }
    
    // 翻转链表
    private ListNode reverse(ListNode head) {
        ListNode res = null;
        while (head != null) {
            ListNode tmp = head.next;
            head.next = res;
            res = head;
            head = tmp;
        }
        
        return res;
    }
    // 判断两个链表是否相等(如果其中一个链表比另一个链表多一个节点,则只比较除了多出节点的其余节点)
    private boolean equal(ListNode l1, ListNode l2) {
        while (l1 != null && l2 != null) {
            if (l1.val != l2.val) {
                return false;
            }
            l1 = l1.next;
            l2 = l2.next;
        }
        
        return true;
    }
}

class ListNode {
    int val;
    ListNode next;
    ListNode(int x) {
        val = x;
    }
}

Complejidad de tiempo El ( norte ) O (n) , espacio El ( 1 ) O (1)

Publicado 393 artículos originales · gustó 0 · 10,000+ visitas

Supongo que te gusta

Origin blog.csdn.net/qq_46105170/article/details/105468235
Recomendado
Clasificación