給你一個單鏈表的頭節點 head ,請你判斷該鏈表是否為回文鏈表。如果是,返回 true ;否則,返回 false 。
時間復雜度較大的解法:
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/// 通過快慢指針找到中間節點,然后以中間節點為起點翻轉后半部分的節點// 比較前半部節點和后半部翻轉后的節點是否相同
class Solution {
public:ListNode* reverseList(ListNode* head){ListNode* pre=nullptr;ListNode* cur=head;while(cur){ListNode* tmp = cur->next;cur->next = pre;pre = cur;cur=tmp;}return pre;}bool isPalindrome(ListNode* head) {if(head->next == nullptr) return true;// 找到中間節點ListNode* fast = head;ListNode* slow = head;// fast向前的速度是slow的2倍while(fast!=nullptr){fast = fast->next;if(fast!=nullptr){fast = fast->next;}slow = slow->next;}// 翻轉鏈表ListNode* backlist = reverseList(slow);// 依次比較兩鏈表while(backlist){if(head->val != backlist->val)return false;head= head->next;backlist=backlist->next;}return true;}
};