- 迴文鏈表
請判斷一個鏈表是否爲迴文鏈表。
示例 1:
輸入: 1->2
輸出: false
示例 2:
輸入: 1->2->2->1
輸出: true
進階:
你能否用 O(n) 時間複雜度和 O(1) 空間複雜度解決此題?
唉 好快 啊 爲什麼
ListNode* reverseList(ListNode* head){
ListNode* pre = NULL;
ListNode* ne = head -> next;
while(1){
head -> next = pre;
if(ne == NULL)
return head;
pre = head;
head = ne;
ne = ne->next;
}
}
public:
bool isPalindrome(ListNode* head) {
if(head == NULL) return true;
ListNode* i = head;
ListNode* j = head;
int len = 0;
while(j != NULL && j -> next != NULL) {
i = i -> next;
j = j -> next -> next;
len++;
}
i = reverseList(i);
while(len--){
if(head->val != i->val) {
return false;
}
head = head -> next;
i = i -> next;
}
return true;
}
自己的思路(超時:快慢指針+翻轉鏈表)
bool isPalindrome(ListNode* head) {
if(!head || !head->next) return true;
// 快慢指針
ListNode *sl = head;
ListNode *fs = head;
// 用於反轉
ListNode *pre = NULL;
ListNode *cur = NULL;
while(fs!=NULL && fs->next!=NULL){
cur = sl;
sl = sl->next;
fs = fs->next->next;
cur->next=pre;
pre = cur;
}
if(fs!=NULL){ //奇數的情況
fs = sl->next; //往右走
sl = cur; //往左走
}else {
fs = sl; //往右走
sl = cur; //往左走
}
while(fs!=NULL){
if(fs->val!=sl->val) return false;
fs = fs->next;
sl = sl->next;
}
return true;
}