leetcode 234. Palindrome Linked List

玩物丧志了这么久 ,,,,也该做道题活动一下脑子啦。。。

leetcode 234. Palindrome Linked List

Given a singly linked list, determine if it is a palindrome.( O(n) time and O(1) space)

我的想法: 先遍历一遍,把value放到栈里,利用栈的特性,对比栈里的值和linklist的值

class Solution {
public:
    bool isPalindrome(ListNode* head) {
        ListNode *begin=head;
        stack<int> value;
        while(begin!= NULL)
        {
            value.push(begin->val);
            begin=begin->next;
        }
        
        begin=head;
        while(begin!=NULL && !value.empty())
        {
            if(begin->val!= value.top()) break;
            else 
            {
                begin=begin->next;
                value.pop();
            }
            
        }
        if(begin!=NULL || !value.empty() ) return false;
        else return true;
    }
};

之后看到论坛里面的另外一种做法,首先遍历linklist 找到中间值 ,顺便把前半段的值逆序,接着 从头开始比较前半段和后半段的值,空间复杂度降低了不少呀 !!!!!!!!!!

class Solution {
public:
   bool isPalindrome(ListNode* head) {
      if( head==NULL || head->next==NULL ) return true;
      // list has at least two nodes
      ListNode *pre = NULL, *pfirst, *psecond;
      auto px1 = head, px2 = head;
      // traversal 1: reverse the first half and get pfirst&psecond in position
      while(true) {
         px2 = px2->next->next;        // move px2 forward
         pfirst = px1; px1 = px1->next;// move px1 forward
         pfirst->next = pre;           // point curent next back
         if( px2 == NULL ) {           // 2n Nodes
            psecond = px1; break;
         } else if( px2->next == NULL ) { // 2n+1 Nodes
            psecond = px1->next; break;
         }
         pre = pfirst;
      }
      // traversal 2: check node values
      while( pfirst!=NULL ) {
         if( pfirst->val != psecond->val ) return false;
         pfirst = pfirst->next; psecond = psecond->next;
      }
      return true;
   }
};



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值