Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述
给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。
例1:
输入: head = [1,2,2,1]
输出: true
例2:
输入: 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;
};
四、总结
这道题等于快慢指针+反转链表。