刷题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.

三、优化措施

posted @ 2020-04-01 08:13  siwei718  阅读(88)  评论(0编辑  收藏  举报