虽然是简单题,但快慢指针的解法挺有意思的。 解题分三个部分,一是用快慢指针找到回文的临界节点。 慢指针每次跑一个,快指针每次跑两个节点,不管链表长度是奇数还是偶数,我们都能得到以慢指针开头的回文后半部分。(在判断条件是while(fast && fast.next)的情况下)
第二部分是反转链表,比较基础;
第三部分,把两个比较两串链表的头结点值,不相等直接返回false,相等则分别都往下移动一个节点,直到比较完都相等则返回true。
const isPalindrome = (head) => {
let fast = head;
let slow = head;
let prev = new ListNode();
while(fast && fast.next){
prev = slow;
slow = slow.next;
fast = fast.next.next;
}
prev.next = null;
let head2 = null;
while(slow){
const next = slow.next;
slow.next = head2;
head2 = slow;
slow = next;
}
while(head && head2){
if(head.val !== head2.val){
return false;
}
head = head.next;
head2 = head2.next;
}
return true;
};
|