LeetCode234. Palindrome Linked List

问题描述:

Given a singly linked list, determine if it is a palindrome.

Example 1:

Input: 1->2
Output: false

Example 2:

Input: 1->2->2->1
Output: true

我的思路:

现将链表里的值存储到一个vector中,然后在对vector从两边向中心对比,空间复杂度为O(n), 时间复杂度为O(n)

代码:

class Solution {
public:
    bool isPalindrome(ListNode* head) {
        ListNode* p = head;
        vector<char> str;
        while(p){
            str.push_back(p->val);
            p = p->next;
        }
        int size = str.size();
        for(int i = 0; i < size/2;i++){
            if(str[i] != str[size-1-i])
                return false;
        }
        return true;
    }
};

 运行时间为21ms

看了网上其他大神的解法,还可以用快慢指针来做。

使用快慢指针让快指针跑到链表尾部,此时慢指针应该在中间部分,这个时候应该注意偶数个节点和奇数个节点的不同并对慢指针的位置进行调节,然后从栈内弹出元素与后半部分链表比较。

class Solution {
public:
    bool isPalindrome(ListNode* head) {
        if(!head || !head->next)
            return true;
        stack<int> stk;
        ListNode* slow = head;
        ListNode* fast = head;
        while(fast && fast->next){
            stk.push(slow->val);
            slow = slow->next;
            fast = fast->next->next;
        }
        if(fast && !fast->next)
            slow = slow->next;
        while(!stk.empty()){
            int a = stk.top();
            if(a != slow->val)
                return false;
            slow = slow->next;
            stk.pop();
        }
        return true;
    }
};

运行时间为22ms

follow up为要求空间复杂度为O(1)

有的方法是找到中点后将后半段链表反转。

但是也有人认为空间复杂度为1时不应该对输入进行改变,不过这道题的题目也没有详细说明。

也有大神利用了递归的堆栈来实现一个自动的翻转:

https://leetcode.com/problems/palindrome-linked-list/discuss/64490/My-easy-understand-C++-solution

运行时间为23秒