ブラシの質問-Leetcode-234。回文リンクリスト

234.回文リンクリスト

トピックリンク

出典:LeetCode(LeetCode)
リンク:https://leetcode-cn.com/problems/palindrome-linked-list/
著作権はLeetCodeが所有しています商用転載の場合は、公認機関にご連絡ください。非商用転載の場合は、出典を明記してください。

タイトル説明

リンクリストが回文リンクリストであるかどうかを確認してください。

例1:

入力:1-> 2
出力:false
例2:

入力:1-> 2-> 2-> 1
出力:true
詳細:
O(n)時間計算量とO(1)空間計算量でこの問題を解決できますか?

トピック分析

Likou 206が終了したら、これをもう一度実行します
。1。ダブルポインタ(配列)スペースo(n)-リンクリストの番号が配列に配置されます。最初のポインタが先頭にあり、2番目のポインタが末尾にあります。 。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
    
    
public:
    bool isPalindrome(ListNode* head) {
    
    
        vector<int> nums;
        ListNode* dummy = head;
        while(dummy){
    
    
            nums.push_back(dummy->val);
            dummy = dummy->next;
        }
        int n = nums.size();
        int left = 0;
        int right = n - 1;
        while(left < right){
    
    
            if(nums[left] != nums[right]){
    
    
                return false;
            }
            left++;
            right--;
        }
        return true;
    }
};

2.再帰+ダブルポインタ再帰スタックスペースo(n)

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
    
    
public:
    ListNode * global;
    bool isPalindrome(ListNode* head) {
    
    
        global = head;
        return recursion(head);

    }
    bool recursion(ListNode* head){
    
    
        if(!head){
    
    
            return true;
        }
        if(!recursion(head->next)){
    
    
            return false;
        }
        if(global->val != head->val){
    
    
            return false;
        }
        global = global->next;//注意 别忘了
        return true;
    }
};

3.スタックスペースo(n)スタックの最下部が先頭に対応し、スタックの末尾が末尾に対応します。リンクリストの先頭とスタックの最上部から判断します。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
    
    
public:
    bool isPalindrome(ListNode* head) {
    
    
        stack<ListNode*> stack;//栈内存储指针
        ListNode * dummy = head;
        while(dummy){
    
    
            stack.push(dummy);
            dummy = dummy->next;
        }
        dummy = head;
        while(dummy){
    
    
            if(dummy->val != stack.top()->val){
    
    
                return false;
            }
            dummy = dummy->next;
            stack.pop();
        }
        return true;
    }
};

上級
4.
高速ポインタ低速ポインタ(通常はリンクリストで使用)-スペースo(1)低速ポインタは1ステップ、高速ポインタは2ステップ、高速ポインタがnullptrに達すると、低速ポインタはリンクリストが開始します。高速ポインタが先頭を指します。後で反転します(逆リンクリストの質問206))
速度ポインタの値は等しくなりますが、等しくない場合はfalseを返します
https://leetcode-cn.com/problems/palindrome-linked -list / solution / wo-de-kuai-man-zhi -zhen-du-cong-tou-kai-shi-gan-ju /

おすすめ

転載: blog.csdn.net/qq_42771487/article/details/113993130