Leetcode回文链表

89 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。

例1:

image.png

输入: head = [1,2,2,1]
输出: true

例2:

image.png

输入: head = [1,2]
输出: false

进阶: 你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

二、解题思路

做的都是medium,奖励自己一道easy,显然,拿个数组存下来就可以解决了,我还是不由自主地开始想满足进阶要求的算法,即 O(n) 时间复杂度和 O(1) 空间复杂度。O(n) 时间复杂度并不难,主要难点在于常数空间复杂度,要实现的话不能存储节点,而是必须要在遍历过程中就完成比较,为此首先需要找到链表的中点,则使用快慢指针;当慢指针指到中点后,反转一遍,然后将反转后的后半链表与链表从头节点开始一个个比较。

三、AC代码

var isPalindrome = function(head) {
    let fast = head;
    let slow = head;
    let prev;
    while (fast){
        slow = slow.next;
        fast = fast.next ? fast.next.next: fast.next;
    }
    while (slow){
        let temp = slow.next;
        slow.next = prev;
        prev = slow;
        slow = temp;
    }
    while (head && prev){
        if (head.val !== prev.val){
            return false;
        }
        head = head.next;
        prev = prev.next;
    }
    return true;
};

四、总结

这道题等于快慢指针+反转链表。