題意:
給定一個鏈表,判斷這個鏈表是否回文的,要求時間復雜度是O(n),空間復雜度是O(1)
思路:
這道題很容易想到用棧來實現,但是如果要用到棧的話我們是達不到空間復雜度的要求
然而這道題我們可以與第206題Reverse Linked List結合起來,傳送門:206題解
首先我們還是適用雙指針的思想,運用快指針fast和慢針slow,fast還是一次走兩步,slow還是一次走一步
那麼當fast無路可走的時候,slow剛好就走了整個鏈表的一半了,這個時候我們就可以根據奇偶不同的情況,以slow指針為界來翻轉後面的鏈表,這就是我們要結合206來做這道題的原因了。
這個時候我們就可以用head和slow指針一個個往下傳遞的同時並且比較來判斷整個鏈表是不是回文鏈表了。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution
{
public:
ListNode* reverseList(ListNode* head)
{
ListNode *pre = nullptr;
ListNode *newhead = nullptr;
ListNode *node = head;
while(node!=nullptr)
{
ListNode *next = node->next;
if(next==nullptr)
newhead = node;
node->next = pre;
pre=node;
node = next;
}
return newhead;
}
bool isPalindrome(ListNode* head)
{
if(head==nullptr || head->next==nullptr) return true;
ListNode *fast = head;
ListNode *slow = head;
while(fast && fast->next)
{
fast = fast->next->next;
slow = slow->next;
}
if(fast) //奇數
{
slow->next = reverseList(slow->next); //翻轉鏈表
slow = slow->next;
}
else //偶數
{
slow = reverseList(slow);
}
while(slow)
{
if(slow->val!=head->val)
return false;
slow = slow->next;
head = head->next;
}
return true;
}
};