leetcode 234. 回文链表

问题描述

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

示例 1:

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

输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

代码

这道题先找到中点,再把后半部分反转,再进行比较,反转部分参考网站.其中找中点部分如果链表为[1,2,2,1]slow为第一个2,如果链表为[1,2,3,2,1]slow为3,因此要反转的都是slow的下一个元素(slow=slow->next).

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    bool isPalindrome(ListNode* head) {
        if(!head|| !head->next)return true;
        ListNode* fast = head,*slow = head,*tmp,*tmp2 = head;
        while(fast->next && fast->next->next)
        {
            slow = slow->next;
            fast = fast->next->next;
        }
        tmp = reverse(slow,NULL);
        slow = slow->next;
        while(tmp && tmp2)
        {
            if(tmp2->val==tmp->val)
                tmp2=tmp2->next,
                tmp=tmp->next;
            else 
                return false;
        }
        return true;
    }
    ListNode* reverse(ListNode* begin,ListNode* end)
    {
        ListNode* a = new ListNode(0),*b = begin,*c;
        while(b != end)
        {
            c = b->next;
            b->next = a->next;
            a->next = b;
            b = c;
        }
        return a->next;
    }
};

结果:

执行用时 :24 ms, 在所有 C++ 提交中击败了68.87%的用户
内存消耗 :15.8 MB, 在所有 C++ 提交中击败了5.23%的用户
posted @ 2020-03-22 10:23  曲径通霄  阅读(140)  评论(0编辑  收藏  举报