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?
满足时间和空间复杂度真得动脑想想啦!
解法1:翻转整个链表,存储翻转链表,从头比较。遍历两边了,空间O(n)也不行。
解法2:借助栈,先找到中点,然后把前半部压入栈。空间不行。
解法3:找到中点,然后把后半部分原地翻转。变成了对称链表了!比较就好!空间O(1)。
class Solution {
public:
bool isPalindrome(ListNode* head) {
if(!head||!head->next) return true;
//先找中点
ListNode *pMid=findMiddle(head);
for(ListNode *pNew=reverseList(pMid);head!=pMid;head=head->next,pNew=pNew->next){
if(head->val!=pNew->val) return false;
}
return true;
}
private:
ListNode* reverseList(ListNode* head){
ListNode* p=NULL;
while(head){
ListNode* q=head->next;
head->next=p;
p=head;
head=q;
}
return p;
}
ListNode* findMiddle(ListNode* head){
ListNode *slow=head, *fast=head;
while(fast&&fast->next){
fast=fast->next->next;
slow=slow->next;
}
return slow;//奇数正好在中间,偶数正好在后一段开头;
}
};