leetcode 141.回文链表

leetcode 234.回文链表

原题传送门

题目描述

回文链表-2020-09-14-16-53-48

讲解

在这个题中,我们首先考虑到,直接开一个数组。将链表中元素全部存进去。然后再数组中用双指针两头遍历比较就行了,可是这个空间复杂度不是O(1)哎。
据说面试时,如果用数组模拟,然后遍历比较,面试官会给挂。
这里提供O(1)的空间复杂度求解。 先用快慢双指针,找到中间节点。慢指针再向前推进的时候,一边进行反转链表。最后,当快指针到头时。慢指针带表着后半段的链表,前半段已经反转,此时直接进行依次比较就行了。
话不多说,看代码。

代码

class Solution {
public:
    bool isPalindrome(ListNode* head) {
        // 方法一, 将链表元素 保存在 一个 容器中,然后进行访问。


        // 方法二, 链表反转。
        if (!head || !head->next) return true;
        // 使用 快慢双指针, 快速找到中间节点。
        ListNode * fast = head;
        ListNode * slow = head;
        //将前面一半进行链表反转。
        ListNode * rev = NULL;
        ListNode * cur = head;

        while (fast != NULL && fast->next != NULL) {
            slow = slow->next;
            fast = fast->next->next;

            // 链表反转
            cur->next = rev;
            rev = cur;
            cur = slow;
        }

        // 如果链表元素 为,奇数个。
        if (fast != NULL) {
            slow = slow->next;
        }

        while ( rev && slow){
            if (rev->val != slow->val) return false;
            rev = rev->next;
            slow = slow->next;
        }
        return true;
    }
};

喜欢的话,给博主赏一杯冰阔乐吧


  转载请注明: Maserhe leetcode 141.回文链表

  目录