- 题目:
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
- 解题思路:
1.现根据快慢指针找出链表中点,然后将中点右端的链表反转,在比较两链表是否相等。若全部相等,则返回true,否则返回false
ListNode* rev(ListNode *head) //反转链表
{
if(head == nullptr || head->next == nullptr)
return head;
ListNode* newhead = rev(head->next);
head->next->next = head;
head->next = nullptr;
return newhead;
}
bool isPalindrome(ListNode* head) {
if(head == nullptr)
return true;
ListNode *fast = head,*slow = head;
while(fast->next!= nullptr && fast->next->next != nullptr)
{
fast = fast->next->next;
slow = slow->next;
}
slow = rev(slow->next); //不用判断奇偶,画图可知
while(slow != nullptr)
{
if(slow->val != head->val)
return false;
slow = slow->next;
head = head->next;
}
return true;
}
复杂度分析:
时间复杂度:O(n)
空间复杂度:O(1)