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;
    }

你可能感兴趣的:(Leetcode)