题目:
//方法一,空间复杂度O(n)
class Solution {
public:bool isPalindrome(ListNode* head) {vector<int> nums; //放进数组后用双指针判断ListNode* cur = head;while(cur){nums.emplace_back(cur->val);cur = cur->next;}for(int i=0, j=nums.size()-1; i < j; i++, j--){if(nums[i]!=nums[j]) return false;}return true;}
};
//方法二,空间复杂度O(1)
class Solution {
public:bool isPalindrome(ListNode* head) {if(!head) return true;ListNode* end = findend(head);ListNode* head1 = reverseList(end->next);ListNode* cur1 = head;ListNode* cur2 = head1;while(cur1&&cur2){if(cur1->val!=cur2->val) return false;cur1 = cur1->next;cur2 = cur2->next;}end->next = reverseList(head1); //恢复链表return true;}//寻找链表前半部分的末尾节点ListNode* findend(ListNode* head){ListNode* slow = head;ListNode* fast = head;while(fast->next&&fast->next->next){fast = fast->next->next;slow = slow->next;}return slow;}//翻转链表ListNode* reverseList(ListNode* head){ListNode* pre = nullptr;ListNode* cur = head;ListNode* tmp;while(cur){tmp = cur->next;cur->next = pre;pre = cur;cur = tmp;}return pre;}
};