[Leetcode] Palindrome Linked List
2015-08-02 12:04
190 查看
一、因为要判断左右链表的断电的对称,可以先将节点取出,放到vector当中,然后使用随机访问的方式对其进行对称性判断
空间复杂度为 O(n),时间复杂度为O(n)
二、可否将空间复杂度降下来,可以采用两个指针,将链表分为两部分。
dummy->head
从dummy开始一个指针每次前进一步,另一个指针每次前进两步,当比较快的指针的下一个节点为空(偶数个node)或者下一个节点的下一个节点为空(奇数个节点)的时候停止。
这是实际上将原来的链表划分为了两部分,对其中一个链表进行reverse,然后进行match,最后在恢复链表。
空间复杂度为 O(1),时间复杂度为O(n)
三、实际上有一个很巧妙的方法,可以使用递归来做。
使用一个节点left记录最左端的节点,进行递归的遍历,当访问到最右端节点时,进行match,然后将left指向下一个节点,然后递归返回,下一个会是另一对对称节点进行比较
left = head;
dp(root){
if root = null return true;
if(dp(root.next)==false) return false;
#match
if(root.val!=left.val) return false;
else{
left=left.next;
return true;
}
}
空间复杂度为 O(n),时间复杂度为O(n)
二、可否将空间复杂度降下来,可以采用两个指针,将链表分为两部分。
dummy->head
从dummy开始一个指针每次前进一步,另一个指针每次前进两步,当比较快的指针的下一个节点为空(偶数个node)或者下一个节点的下一个节点为空(奇数个节点)的时候停止。
这是实际上将原来的链表划分为了两部分,对其中一个链表进行reverse,然后进行match,最后在恢复链表。
空间复杂度为 O(1),时间复杂度为O(n)
三、实际上有一个很巧妙的方法,可以使用递归来做。
使用一个节点left记录最左端的节点,进行递归的遍历,当访问到最右端节点时,进行match,然后将left指向下一个节点,然后递归返回,下一个会是另一对对称节点进行比较
left = head;
dp(root){
if root = null return true;
if(dp(root.next)==false) return false;
#match
if(root.val!=left.val) return false;
else{
left=left.next;
return true;
}
}
相关文章推荐
- mongodb简单操作
- acm-UVA10004解题报告
- 油田统计
- hrbust 1339 Touring 最短路Dijkstra 邻接表
- SQL求最大值的几种方式
- 编程的入门(一)
- Codeforces 553 B. Kyoya and Permutation
- UVALive 2318 水题
- poj 2125 Destroying The Graph 最小点权覆盖集+拆点+求割边
- Java基础---JAVA基本数据类型,关键字
- [POJ 3348] Cows 凸包模板
- 三大框架面试题
- VC6.0工程转换到VS2010版本的常见问题
- DT大数据梦工厂 第75讲
- Win7版IE10浏览器正式版官方下载地址
- VMWare虚拟机中安装Redhat linux操作系统图解(2)
- poj2367Genealogical tre
- DICOM:dcm4che工具包如何压缩dcm文件探讨(续篇)
- 数据结构基础温故-5.图(下):最短路径
- 第八课,T语言功能和参数(版本5.0)