zoukankan      html  css  js  c++  java
  • 57-Palindrome Linked List

    1. Palindrome Linked List My Submissions QuestionEditorial Solution
      Total Accepted: 46990 Total Submissions: 166743 Difficulty: Easy
      Given a singly linked list, determine if it is a palindrome.

    Follow up:
    Could you do it in O(n) time and O(1) space?

    先给出一种时间O(n)空间O(n)的算法,思路就是顺序把值放入到顺序表
    然后在顺序表判定回文

    class Solution {
    public:
        bool isPalindrome(ListNode* head) {
            vector<int> vals;
    
            while(head!=NULL){
                vals.push_back(head->val);
                head = head->next;
            }
            int n = vals.size(),flag=0;
            for(int i=0;i<n/2;++i)
                if(vals[i]!=vals[n-1-i]){
                    flag =1;
                    break;
                }
            if(flag==1)return false;
            else return true;
        }
    };

    给出O(n)空间O(1)的算法,虽然代码长很多,但是省空间啊!!
    思想:O->O->O->O->O前半部分逆转,然后中间出发向两端比较

    class Solution {
    public:
        bool isPalindrome(ListNode* head) {
            if(head==NULL||head->next==NULL)return true;
            int len=0;
            ListNode *p =head;
            while(p!=NULL){
                len++;
                p=p->next;
            }
            if(len==2)return head->next->val==head->val; //因为逆转的时候是针对大于等于2(2*2就是4)的情况来考虑,所以先处理小于4 
            if(len==3)return head->val==head->next->next->val;
            int i=1;
            ListNode *fir=head,*sec=head;
            while(i++<len/2)fir=fir->next;
            if(len%2==0)sec = fir->next;
            else sec = fir->next->next;
            if(len>=4){          //逆转前半部分 
                ListNode *pre_next = fir->next;
                ListNode *tmp=head->next,*pretmp = head;
                while(tmp!=NULL&&tmp!=pre_next){ 
                    ListNode *tmpnext = tmp->next;
                    tmp->next = pretmp;
                    pretmp = tmp;
                    tmp=tmpnext;
                }
                head->next=NULL;
            }
            while(fir!=NULL){  //从中间出发判断回文 
                if(fir->val!=sec->val)return false;
                fir = fir->next;
                sec = sec->next;
            }
            return true;
        }
    };
  • 相关阅读:
    多线程
    python 进程间通信
    python 生产者消费者模型
    多线程锁
    io多路复用(三)
    div 加滚动条的方法
    10矩形覆盖
    11.二进制中1的个数
    12数值的整数次方
    9 变态跳台阶
  • 原文地址:https://www.cnblogs.com/freeopen/p/5482906.html
Copyright © 2011-2022 走看看