leetcode 234 回文链表
思路
- 快慢指针;
- 慢指针走到中点;
- 反转后半部分链表;
- 从头到尾比对;
题解
class Solution {
public:
bool isPalindrome(ListNode* head) {
// O(n)、O(1)
ListNode* slow = head, *fast = head->next, *prev = nullptr;
// 快慢指针
while (fast){
slow = slow->next;
fast = fast->next ? fast->next->next: fast->next;//末尾结点
}
while (slow){//reverse
ListNode* temp = slow->next;
slow->next = prev;
prev = slow;
slow = temp;
}
while (head && prev){//check 从头结点、中点
if (head->val != prev->val){
return false;
}
head = head->next;
prev = prev->next;
}
return true;
}
};