LeetCode 234: 迴文鏈表(快慢指針+反轉鏈表)

  1. 迴文鏈表
    請判斷一個鏈表是否爲迴文鏈表。

示例 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;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章