leetcode 234.回文链表
原题传送门
题目描述
讲解
在这个题中,我们首先考虑到,直接开一个数组。将链表中元素全部存进去。然后再数组中用双指针两头遍历比较就行了,可是这个空间复杂度不是O(1)哎。
据说面试时,如果用数组模拟,然后遍历比较,面试官会给挂。
这里提供O(1)的空间复杂度求解。 先用快慢双指针,找到中间节点。慢指针再向前推进的时候,一边进行反转链表。最后,当快指针到头时。慢指针带表着后半段的链表,前半段已经反转,此时直接进行依次比较就行了。
话不多说,看代码。
代码
class Solution {
public:
bool isPalindrome(ListNode* head) {
// 方法一, 将链表元素 保存在 一个 容器中,然后进行访问。
// 方法二, 链表反转。
if (!head || !head->next) return true;
// 使用 快慢双指针, 快速找到中间节点。
ListNode * fast = head;
ListNode * slow = head;
//将前面一半进行链表反转。
ListNode * rev = NULL;
ListNode * cur = head;
while (fast != NULL && fast->next != NULL) {
slow = slow->next;
fast = fast->next->next;
// 链表反转
cur->next = rev;
rev = cur;
cur = slow;
}
// 如果链表元素 为,奇数个。
if (fast != NULL) {
slow = slow->next;
}
while ( rev && slow){
if (rev->val != slow->val) return false;
rev = rev->next;
slow = slow->next;
}
return true;
}
};
喜欢的话,给博主赏一杯冰阔乐吧