zoukankan      html  css  js  c++  java
  • 刷题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.
    

    三、优化措施

    所有文章,坚持原创。如有转载,敬请标注出处。
  • 相关阅读:
    ffmpeg基础 -- avio_alloc_context 读内存
    C++入门--运算符重载
    驻极体话筒与MEMS话筒
    gdb调试段错误
    从零开始学Axure原型设计(高级篇)
    从零开始学Axure原型设计(进阶篇)
    从零开始学Axure原型设计(入门篇)
    自学编程的人,都是怎么找到自己的第一份工作的
    做一名程序员需要学哪些知识
    微信web开发者工具
  • 原文地址:https://www.cnblogs.com/siweihz/p/12288282.html
Copyright © 2011-2022 走看看