編寫一個函數,檢查輸入的鏈表是否是迴文的。
示例 1:
輸入: 1->2
輸出: false
示例 2:輸入: 1->2->2->1
輸出: true
進階:
你能否用 O(n) 時間複雜度和 O(1) 空間複雜度解決此題?
思路
使用快慢指針先找到中間節點,快指針速度爲每次兩個節點,慢指針爲每次一個節點;
找到中間節點後,從中間節點開始反轉鏈表;
然後比較前後兩段鏈表是否相等
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
bool isPalindrome(ListNode* head) {
// 邊界判斷
if(!head) return true;
// 快慢指針查找中間節點
ListNode* pre= head, *last= head->next;
while(last){
pre= pre->next;
last= last->next;
if(last) last= last->next;
}
// 從中間節點將後面的鏈表反轉
ListNode* temp= NULL;
last= pre->next;
pre->next= NULL;
while(last){
temp= last->next;
last->next= pre;
pre= last;
last= temp;
}
// 比較前後兩段鏈表是否相等
while(head&& pre){
if(head->val!= pre->val)
return false;
head= head->next;
pre= pre->next;
}
return true;
}
};