Leetcode [234] 回文链表 回文 链表

/*
 * @lc app=leetcode.cn id=234 lang=cpp
 *
 * [234] 回文链表
 *
 * https://leetcode-cn.com/problems/palindrome-linked-list/description/
 *
 * algorithms
 * Easy (47.14%)
 * Likes:    983
 * Dislikes: 0
 * Total Accepted:    246.9K
 * Total Submissions: 518K
 * Testcase Example:  '[1,2,2,1]'
 *
 * 请判断一个链表是否为回文链表。
 * 
 * 示例 1:
 * 
 * 输入: 1->2
 * 输出: false
 * 
 * 示例 2:
 * 
 * 输入: 1->2->2->1
 * 输出: true
 * 
 * 
 * 进阶:
 * 你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
 * 
 */

// @lc code=start
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */

思路:

如何高效判断回文单链表?

1、通过快慢指针查找链表的中点,如果fast指针没有指向null,说明链表长度为奇数,slow还要再前进一步

 

 2、slow开始反转后面的链表,现在就可以开始比较回文串了

class Solution {
public:
    bool isPalindrome(ListNode* head) {
        ListNode *fast=head;
        ListNode *slow=head;
        while(fast!=NULL&&fast->next!=NULL)
        {
            slow=slow->next;
            fast=fast->next->next;
        }
        if(fast!=NULL) slow=slow->next;
        ListNode *right=reverse(slow);
        ListNode *left=head;
        while(right!=NULL)
        {
            if(left->val!=right->val) return false;
            left=left->next;
            right=right->next;
        }
        return true;
    }
    ListNode* reverse(ListNode *head)
    {
        if(!head) return head;
        ListNode* pre=NULL;
        ListNode* cur=head;
        while(cur!=NULL)
        {
            ListNode* next=cur->next;
            cur->next=pre;
            pre=cur;
            cur=next;
        }
        return pre;
    }
};

 

posted @ 2021-05-18 20:18  鸭子船长  阅读(70)  评论(0编辑  收藏  举报