【LEETCODE】234-Palindrome Linked List
2015-11-24 20:02
411 查看
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?
参考: http://bookshadow.com/weblog/2015/07/10/leetcode-palindrome-linked-list/
快慢指针: http://www.cnblogs.com/twobin/p/3361227.html
普通方法:先遍历一遍单链表确定其长度L后,再从头节点出发循环L/2次即可查找到单链表的中间节点。该问题如果采用普通的方法虽然简单,但是查找效率太低。
快慢指针:设置两个指针*fast、*slow都指向单链表的头节点,其中*fast的移动速度是*slow的2倍,当*fast指向末尾节点的时候,slow正好就在中间了,可以大大提高查找的效率。
当然,此时算法还要考虑链表结点个数的奇偶数因素,当快指针移动x次后到达表尾(1+2x),说明链表有奇数个结点,直接返回慢指针指向的数据即可。如果快指针是倒数第二个结点,说明链表结点个数是偶数,这时可以实际情况返回上中位数或下中位数或(上中位数+下中位数)的一半。
Follow up:
Could you do it in O(n) time and O(1) space?
参考: http://bookshadow.com/weblog/2015/07/10/leetcode-palindrome-linked-list/
快慢指针: http://www.cnblogs.com/twobin/p/3361227.html
普通方法:先遍历一遍单链表确定其长度L后,再从头节点出发循环L/2次即可查找到单链表的中间节点。该问题如果采用普通的方法虽然简单,但是查找效率太低。
快慢指针:设置两个指针*fast、*slow都指向单链表的头节点,其中*fast的移动速度是*slow的2倍,当*fast指向末尾节点的时候,slow正好就在中间了,可以大大提高查找的效率。
当然,此时算法还要考虑链表结点个数的奇偶数因素,当快指针移动x次后到达表尾(1+2x),说明链表有奇数个结点,直接返回慢指针指向的数据即可。如果快指针是倒数第二个结点,说明链表结点个数是偶数,这时可以实际情况返回上中位数或下中位数或(上中位数+下中位数)的一半。
# Definition for singly-linked list. # class ListNode(object): # def __init__(self, x): # self.val = x # self.next = None class Solution(object): def isPalindrome(self, head): """ :type head: ListNode :rtype: bool """ if head is None or head.next is None: return True slow=fast=head #快慢指针 while fast.next and fast.next.next: slow=slow.next fast=fast.next.next #倒置后半部分 p=slow.next #不管奇偶 p都位于后半部分的头 last=None while p: next=p.next p.next=last #最后slow.next.next is None last=p #last最后位于最后一个 p=next #p1从前半部分的头 p2从后半部分的头 开始比较值是否相等 p1=head p2=last while p2 and p1.val==p2.val: p1=p1.next p2=p2.next #恢复原结构,不恢复也可以AC p=last last=None while p: next=p.next p.next=last last=p p=next return p2 is None #如果回文,最后p2是None,否则,p2是开始不相等的那个点
相关文章推荐
- 单源最短路-Dijkstra算法 (poj 1502)
- 实验三
- UIImageView的图片轮播属性
- 递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
- 树-C实现
- 长期在后台定时运行的服务 第一行代码
- jsp跳转servlet,servlet跳转jsp,servlet跳转servlet的路径问题
- java回调机制的理解
- java缓冲区
- 高斯混合模型 + 高斯分布回顾
- usb设备的probe全过程
- 使用java实现定时器定时删除系统文件
- 编写一个函数实现n^k,使用递归实现
- 阿里悟空学习
- 字符串的split方法
- Java中equals和==的区别
- 实现一个日期计算器
- GPU之cuda学习第三章内容总结
- Apache的用户认证
- 初步解析内核函数copy_to_user和copy_from_user