题目地址:
https://leetcode.com/problems/palindrome-linked-list/
给定一个链表,判断其是否回文。
先找到链表中点(若长度为偶数,则找到中间偏后的那个),然后翻转后半部分,最后比较一下两个链表即可。代码如下:
/**
* 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) {
auto dummy = new ListNode(0, head);
auto fast = dummy, slow = dummy;
while (fast && fast->next) slow = slow->next, fast = fast->next->next;
auto rev = [&](auto head) {
ListNode* prev = nullptr;
while (head) {
auto tmp = head->next;
head->next = prev;
prev = head;
head = tmp;
}
return prev;
};
auto cmp = [&](auto l1, auto l2) {
while (l1 && l2) {
if (l1->val != l2->val) return false;
l1 = l1->next;
l2 = l2->next;
}
return true;
};
return cmp(dummy->next, rev(slow->next));
}
};
时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)。