原题链接:回文链表
个人解法
思路:
我们可以利用快慢指针找到链表的中间位置,然后翻转后半部分链表,此时再判断前半部分和后半部分是否一一相等即可。
当然也可以全部翻转链表查看时否相等。
时间复杂度: O ( n ) O(n) O(n)
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
bool isPalindrome(ListNode* head) {
if(head == nullptr || head->next == nullptr) return true;
ListNode *p = head, *q = head;
while(q->next && q->next->next) {
q = q->next->next;
p = p->next;
}
ListNode *mid = p;
p = p->next;
ListNode *end = p;
q = p->next;
while(q) {
ListNode *t = q->next;
q->next = p;
p = q, q = t;
}
mid->next = p, end->next = nullptr;
for(ListNode *t1 = head, *t2 = mid->next; t2; t1 = t1->next, t2 = t2->next) {
if(t1->val != t2->val) return false;
}
return true;
}
};