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?
我的code,4 ms
static int x=[](){
std::ios::sync_with_stdio(false);
cin.tie(NULL);
return 0;
}();
class Solution {
public:
bool isPalindrome(ListNode* head) {
ListNode* cur = head;
ListNode* mid = head;
ListNode* reverse=NULL;
while(cur&&cur->next){
cur = cur->next->next;
ListNode* temp = reverse;
reverse = mid;
mid = mid->next;
reverse->next = temp;
}
if(cur){
mid = mid->next;
}
if(reverse==NULL){
return true;
}
while(reverse){
if(reverse->val!=mid->val){
return false;
}
reverse = reverse->next;
mid = mid->next;
}
return true;
}
};
code2,8ms
static int x = []() { std::ios::sync_with_stdio(false); cin.tie(NULL); return 0; }();
class Solution
{
public:
bool _isPalindrome(ListNode **left, ListNode *right)
{
if(right == nullptr)
return true;
bool result = _isPalindrome(left, right->next);
if(!result) return false;
bool result1 = (*left)->val == right->val;
(*left) = (*left)->next;
return result1;
}
bool isPalindrome(ListNode *head)
{
return _isPalindrome(&head, head);
}
};
递归?好难想到这种解法