234. Palindrome Linked List

Leetcode link

题目简介

/**
 * @param {ListNode} head
 * @return {boolean}
 */

题目给我们一个链表头 head

要求我们判断该链表是否能构成回文

解题思路

这题有很多种解决方法,但是如果要用到 O(1) 的空间复杂度,我们需要一些额外的操作

整体思路如下:

  1. 我们找到链表中的中间节点
  2. 把中间节点后的链表翻转
  3. 从原来链表的两侧向中间比较节点元素

Javascript

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @return {boolean}
 */
var isPalindrome = function(head) {
    // 1. find the middle node
    let fast = head
    let slow = head
    while(fast && fast.next) {
        fast = fast.next.next
        slow = slow.next
    }

    // 2. reverse the second half of the list
    let prev = null
    let cur = slow
    while(cur) {
        let next = cur.next
        cur.next = prev
        prev = cur
        cur = next
    }

    // 3. compare 2 list
    let first = head
    let second = prev
    while(second) {
        if(first.val !== second.val) {
            return false
        }
        first = first.next
        second = second.next
    }

    return true
};

results matching ""

    No results matching ""