leetcode 234.回文链表

官方题解给出三个方法。

方法一为利用一个二维数组记录值,然后遍历数组去判断是否回文。时间代价和空间代价都为O(n)。

实现代码如下

/**
 * 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> tmp;
        ListNode* curNode=head;
        while (curNode!= nullptr){
            tmp.push_back(curNode->val);
            curNode=curNode->next;
        }
        int len =tmp.size();
        for (int i = 0; i < len/2; ++i) {
            if(tmp[i]!=tmp[len-1-i])return false;
        }
        return true;
    }
};

 

方法二递归法。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* preNode;
    bool checkPalind(ListNode* curNode){
        if(curNode!= nullptr){
            if(!checkPalind(curNode->next))return false;
            if(curNode->val!=preNode->val)return false;
            preNode=preNode->next;
        }
        return true;
    }
    bool isPalindrome(ListNode* head) {
        preNode=head;
        return checkPalind(head);
    }
};

 

方法三,寻找链表的中间节点(通过快慢指针实现,慢指针走一步,快指针走两步,最后慢指针指向中间节点),将链表后半部分反转。最后比较前半段和后半段节点的值是否相同即可。这样空间代价降为O(1)。

如果需要维持链表结构,那返回结果前需要把链表后半段再次反转。

posted @ 2020-08-31 12:01  布羽  阅读(144)  评论(0)    收藏  举报