美文网首页LeeCode题目笔记
2019-09-18 回文链表

2019-09-18 回文链表

作者: Antrn | 来源:发表于2019-09-28 11:08 被阅读0次

    要求链表是不是回文的,转换了一下思路,将链表中的值提取出来放到vector中,然后再判断就简单了。
    请判断一个链表是否为回文链表。

    示例 1:

    输入: 1->2
    输出: false
    

    示例 2:

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

    进阶:

    你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

    C++
    /**
     * 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) {
            vector<int> v;
            ListNode *dummyHead = head;
            while(dummyHead!=NULL){
                v.push_back(dummyHead->val);
                dummyHead = dummyHead->next;
            }
            int s = v.size();
            for(int i=0; i<s/2; i++){
                if(v[i] != v[s-i-1]){
                    return false;
                }
            }
            return true;
        }
    };
    
    C++2

    使用快慢指针,快指针的速度是慢指针的两倍,所以快指针到达末尾的时候,慢指针应该在中点。当元素个数为奇数的时候,将慢指针指向的位置向后推进一位作为快指针比较的起始点;当元素总个数为偶数的时候,跳出循环的条件是快指针为NULL,所以只需要把慢指针指向的位置作为后续快指针比较的起始点即可。而慢指针比较的起始点是跳出循环时慢指针的前一个指针,这时它指向翻转前半段元素后的起始点,直接比较两端链表即可分辨是否是回文链表了。

    /**
     * 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||!head->next) return true;
            ListNode*pre = NULL;
            ListNode*slow = head;
            ListNode*fast = head;
            ListNode*s = NULL;
            while(fast != NULL && fast->next != NULL)
            {
                pre = slow;
                slow = slow->next;
                fast = fast->next->next;
                pre->next = s;
                s = pre;
            }
            ListNode*temp = slow;
            if(fast != NULL) temp = temp->next; 
            slow = pre;
            while(temp!=NULL)
                if(temp->val!=slow->val) return false;
                else {temp = temp->next;slow = slow->next;}
            return true;
            
        }
    };
    

    相关文章

      网友评论

        本文标题:2019-09-18 回文链表

        本文链接:https://www.haomeiwen.com/subject/ktvhuctx.html