请判断一个链表是否为回文链表。
示例 1:
输入: 1->2 输出: false
示例 2:
输入: 1->2->2->1 输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
不满足时间复杂度:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
bool isPalindrome(ListNode* head) {
if (!head || !head->next) return true;
ListNode *fast = head;
ListNode *slow = head;
int count = 0;
while(fast != NULL && fast->next != NULL)
{
fast = fast->next;
count++;
}
int n = count;
while(count > n / 2 && fast!=NULL && slow!=NULL)
{
if(fast->val != slow->val)
return false;
else{
fast = head;
count--;
for(int i = 0;i<count;i++){
fast = fast->next;
}
slow = slow->next;
}
}
return true;
}
};
mark一下别人更好的方法:https://www.cnblogs.com/grandyang/p/4635425.html
快慢指针,慢指针每次走一步,快指针每次走两步,快指针到头了,慢指针到中点,再将后半部分反转,再和前半部分比较即可
class Solution {
public:
bool isPalindrome(ListNode* head) {
if (!head || !head->next) return true;
ListNode *slow = head, *fast = head;
while (fast->next && fast->next->next) {
slow = slow->next;
fast = fast->next->next;
}
ListNode *last = slow->next, *pre = head;
while (last->next) {
ListNode *tmp = last->next;
last->next = tmp->next;
tmp->next = slow->next;
slow->next = tmp;
}
while (slow->next) {
slow = slow->next;
if (pre->val != slow->val) return false;
pre = pre->next;
}
return true;
}
};