1. 程式人生 > 實用技巧 >Leetcode.234 迴文連結串列

Leetcode.234 迴文連結串列

題目

請判斷一個連結串列是否為迴文連結串列

輸入: 1->2 輸出: false

輸入: 1->2->2->1 輸出: true

程式碼

 1 class Solution {
 2 public:
 3     bool isPalindrome(ListNode* head) {
 4         if(head == NULL || head->next == NULL) return true;
 5         //快慢指標用來尋找中間節點
 6         ListNode* fast = head;
 7         ListNode* slow = head;
8 9 //找到中間節點 10 while(fast && fast->next){ 11 slow = slow->next; 12 fast = fast->next->next; 13 } 14 15 //反轉連結串列 16 ListNode* pre = slow; ListNode* cur = slow->next; 17 while(cur != NULL){ 18 ListNode* tmp = cur->next;
19 cur->next = pre; 20 pre = cur; 21 cur = tmp; 22 } 23 //結束後pre就到了尾節點 24 25 slow->next = NULL; 26 while(head && pre){ 27 if(head->val != pre->val) return false; 28 head = head->next; 29
pre = pre->next; 30 } 31 return true; 32 33 } 34 };

時間複雜度O(n),空間複雜度O(1)

總結

1.在未知連結串列長度的情況下,如何在時間複雜度O(n)下尋找連結串列中間節點 ? 採用快慢指標(太秀了)

2.迴文連結串列問題可以看成

(1)尋找連結串列中間節點

 (2)後半部分連結串列逆置

 (3)前後兩部分進行比較