Given a singly linked list, determine if it is a palindrome.
Example 1:
Input: 1->2
Output: false
Example 2:
Input: 1->2->2->1
Output: true
Follow up:
Could you do it in O(n) time and O(1) space?
题目链接:https://leetcode-cn.com/problems/palindrome-linked-list/
思路
题目要求时间复杂度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==NULL || head->next==NULL) return true;
auto l = head, r = head;
while(r->next){
r = r->next;
if(r->next){
r = r->next;
l = l->next;
}
}
r = l->next;
auto nxt = r->next;
while(nxt){
auto last = r;
r = nxt;
nxt = r->next;
r->next = last;
}
l->next->next = NULL;
l->next = NULL;
l = head;
while(r){
if(l->val!=r->val) return false;
else{
l = l->next;
r = r->next;
}
}
return true;
}
};