当前位置 博文首页 > Quanのブログ:LeetCode234. 回文链表c++

    Quanのブログ:LeetCode234. 回文链表c++

    作者:[db:作者] 时间:2021-08-14 21:07

    请判断一个链表是否为回文链表。

    示例 1:

    输入: 1->2
    输出: false

    示例 2:

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

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

    非进阶做法简直easy;

    进阶解析:翻转后一半,如果奇数,翻转后面(n-1)/2个元素,具体翻转利用前面的翻转算法,不影响空间复杂度,时间复杂度并列n。然后从head位置和1/2链表位置开始一起往后走,一样就->next不一样立马return false;

    这里用了一个计算链表长度函数,时间On,空间O1。也可以用双指针法,就能找到中间指针;

    代码如下:

    class Solution {
    public:
        bool isPalindrome(ListNode* head) {
            int n=len(head);
            if(n==1)return true;
            ListNode*head2=head;
            for(int i=0;i<(n/2+n%2);i++){
                head2=head2->next;
            }
            head2=reverseList(head2);
            while(head2!=NULL){
                if(head->val!=head2->val) return false;
                else{head=head->next;head2=head2->next;}
            }
            return true;
        }
        int len(ListNode*head){
            int n=0;
            while(head!=NULL){
                head=head->next;
                ++n;
            }
            return n;
        }
        ListNode* reverseList(ListNode* head) {
            ListNode*pt=head;
            ListNode*temp;
            if(pt==NULL) return head;
            while(pt->next!=NULL){
                temp=pt->next;
                pt->next=pt->next->next;
                temp->next=head;
                head=temp;
            }
            return head;
        }
    };

    ?

    cs