题目描述:
Given a singly linked list, determine if it is a palindrome.
Follow up:
Could you do it in O(n) time and O(1) space?
判断回文链表,要求O(n)的时间复杂度和O(1)的空间复杂度,可以先用快慢指针找到链表的中点,然后断开,把其中一个子链表翻转,再比较两个链表即可。
class Solution {
public:
bool isPalindrome(ListNode* head) {
if(head==NULL||head->next==NULL) return true;
ListNode* fast=head;
ListNode* slow=head;
while(fast->next!=NULL&&fast->next->next!=NULL)
{
fast=fast->next->next;
slow=slow->next;
}
ListNode* head2=slow->next;
slow->next=NULL;
head2=reverse(head2);
while(head!=NULL&&head2!=NULL)
{
if(head->val!=head2->val) return false;
head=head->next;
head2=head2->next;
}
return true;
}
ListNode* reverse(ListNode* node){
if(node==NULL||node->next==NULL) return node;
ListNode* p=node->next;
ListNode* head=reverse(p);
p->next=node;
node->next=NULL;
return head;
}
};