刷题234. Palindrome Linked List
一、题目说明
题目234. Palindrome Linked List,判断一个链表是否是回文。难度是Easy!
二、我的解答
这个题目,时间复杂度要求O(n),空间复杂的O(1)。如果不按照上述要求,回文还是简单的。
比如,将链表放到数组中,然后前后比较就是了。
下面用的是另外一种思路,先找到链表中间位置,然后翻转右边的部分,然后再比较。
class Solution{
public:
bool isPalindrome(ListNode* head){
if(head==NULL || head->next==NULL){
return true;
}
//找到中间节点
ListNode* fast=head,*slow=head,*left,*right,*tmp;
while(fast && fast->next){
fast = fast->next;
fast = fast->next;
slow = slow->next;
}
if(fast==NULL){
//总共偶数个元素
right = slow;
}else{
//总共奇数个元素
right = slow->next;
}
//翻转后半部分
ListNode* p = right->next;
bool first = true;
while(p !=NULL){
tmp = p->next;
p->next = right;
if(first){
right->next = NULL;
first = false;
}
right = p;
p = tmp;
}
//判断是否是回文
left = head;
while(left!=NULL && right!=NULL && (left->val == right->val)){
left = left->next;
right = right->next;
}
if(left == slow){
return true;
}else{
return false;
}
}
};
性能如下:
Runtime: 32 ms, faster than 17.18% of C++ online submissions for Palindrome Linked List.
Memory Usage: 12.7 MB, less than 75.86% of C++ online submissions for Palindrome Linked List.
三、优化措施
无
所有文章,坚持原创。如有转载,敬请标注出处。