234. 回文链表
  Vi5FLT7akNuP 2023年12月02日 26 0


Problem: 234. 回文链表


文章目录

  • 解题方法
  • 复杂度
  • Code


解题方法

找到链表的中点:首先,我们可以使用快慢指针技巧来找到链表的中点。慢指针每次移动一步,快指针每次移动两步。当快指针到达链表的末尾时,慢指针就会指向链表的中点。
反转后半部分(使用递归反转链表)
比较前半部分和后半部分

复杂度

  • 时间复杂度:

时间复杂度, 示例: 234. 回文链表_中间结点

  • 空间复杂度:

空间复杂度, 示例: 234. 回文链表_中间结点

Code

class Solution {
public:
    // 思路 : 使用快慢指针的方法,找到链表的中间结点
    // 反转后面的部分,再比较两部分

    ListNode* find_midNode(ListNode* head){
        if(head == NULL) return NULL ; 
        if(head->next == NULL ) return head ; 
        ListNode* slow = head ; 
        ListNode* fast = head ; 

        while(fast != NULL && fast->next != NULL){
            fast = fast->next->next ; 
            slow = slow->next ; 
        }
        return slow  ; 
    }
    // 使用递归 反转
    ListNode* reverse(ListNode* head) {
        if(head == NULL  || head->next ==NULL) return head; 

        ListNode* newHead = reverse(head->next) ; 
        head->next->next = head ; 
        head->next = nullptr ; 
        return newHead  ;
    }
    bool isPalindrome(ListNode* head) {
        if(head->next == NULL )return true ; 
        // 找到中间结点 
        ListNode *mid_node = find_midNode(head) ;
        // 反转
        ListNode* right = reverse(mid_node) ; 

        for(ListNode*left = head ; right ; left =left->next, right=right->next) {
            if(left->val !=right->val) return false ;
        }

        return true ; 
    }
};


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月02日 0

暂无评论

推荐阅读
Vi5FLT7akNuP