Problem: 234. 回文链表
文章目录
- 解题方法
- 复杂度
- Code
解题方法
找到链表的中点:首先,我们可以使用快慢指针技巧来找到链表的中点。慢指针每次移动一步,快指针每次移动两步。当快指针到达链表的末尾时,慢指针就会指向链表的中点。
反转后半部分(使用递归反转链表)
比较前半部分和后半部分
复杂度
- 时间复杂度:
时间复杂度, 示例: O ( n ) O(n) O(n)
- 空间复杂度:
空间复杂度, 示例: O ( n ) O(n) O(n)
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 ; }
};