要求使用O(n)的时间复杂度和O(1)的空间复杂度
class Solution {
public:
bool isPalindrome(ListNode* head) {
ListNode *fast=head,*slow=head,*aux=NULL,*temp;
while(fast&&fast->next){
temp=slow;
fast=fast->next->next;
slow=slow->next;
temp->next=aux;
aux=temp;
}
if(fast) {slow=slow->next;}
while(slow){
if(aux->val!=slow->val) return false;
slow=slow->next;
aux=aux->next;
}
return true;
}
};
这里使用fast指针每次走两步,slow每次走一步。aux逆序记录slow走过的节点。
当fast走到终点,slow走过一半,再把链表slow和aux做比较。
其中有一点要注意slow=slow->next必须在temp->next=aux之前,具体原因可画图理解。