LeetCode——234. 回文链表

126 阅读1分钟

请判断一个链表是否为回文链表。

示例 1:

输入: 1->2 输出: false 示例 2:

输入: 1->2->2->1 输出: true

解题思路

快慢指针 + 反转

遍历链表 fast 指针走两步 slow指针走一步,当 fast 指针遍历结束时,slow 指针正好处于链表的中位,slow 指针继续遍历同时反转链表获得 reverse 链表,对比 原始链表head 和 反转链表 reverse 即可得出是否为回文链表

代码实现

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @return {boolean}
 */
var isPalindrome = function(head) {
    let fast = head 
    let slow = head 
    // 快慢指针遍历
    while(fast && fast.next && fast.next.next){
        slow = slow.next 
        fast = fast.next.next 
    }
    let reverse = null
    // 反转链表
    while(slow){
        [slow.next,reverse,slow] = [reverse,slow,slow.next]
    }
    let cur = head 
    // 反转链表对比原始链表
    while(cur && reverse){
        if(cur.val != reverse.val){
            return false
        }
        cur = cur.next
        reverse = reverse.next
    }
    return true
};

性能

时间复杂度:O(n)

空间复杂度:O(1)