LeetCode----Linked List Cycle
2015-10-31 11:26
691 查看
Linked List Cycle
Given a linked list, determine if it has a cycle in it.
Follow up:
Can you solve it without using extra space?
分析:
判断一个链表是否含有环。
使用弗洛伊德循环检测法。时间复杂度为O(n)。
算法详解如下:
How do you determine if your singly-linked list has a cycle? In the late 1960s, Robert W. Floyd invented an algorithm that worked in linear (O(N)) time. It is also called Floyd's cycle detection algorithm.
The easiest solution to the cycle detection problem is to run through the list, keeping track
of which nodes you visit, and on each node check to see if it is the same as any of the previous nodes. It's pretty obvious that this runs in quadratic (O(N^2)) time... not very efficient, and actually more complicated than this one.
The Tortoise and the Hare is possibly the most famous cycle detection algorithm, and is surprisingly straightforward. The Tortoise and the Hare are both pointers, and both start at the top of the list. For each iteration, the Tortoise takes one step and the
Hare takes two. If there is a loop, the hare will go around that loop (possibly more than once) and eventually meet up with the turtle when the turtle gets into the loop. If there is no loop, the hare will get to the end of the list without meeting up with
the turtle.
Why can't you just let the hare go by itself? If there was a loop, it would just go forever; the turtle ensues you will only take n steps at most.
For a somewhat more efficient algorithm, check out Brent's Cycle Detection Algorithm (The Teleporting Turtle).
伪码:
我的代码:
Given a linked list, determine if it has a cycle in it.
Follow up:
Can you solve it without using extra space?
分析:
判断一个链表是否含有环。
使用弗洛伊德循环检测法。时间复杂度为O(n)。
算法详解如下:
Floyd's Cycle Detection Algorithm (The Tortoise and the Hare)
How do you determine if your singly-linked list has a cycle? In the late 1960s, Robert W. Floyd invented an algorithm that worked in linear (O(N)) time. It is also called Floyd's cycle detection algorithm.The easiest solution to the cycle detection problem is to run through the list, keeping track
of which nodes you visit, and on each node check to see if it is the same as any of the previous nodes. It's pretty obvious that this runs in quadratic (O(N^2)) time... not very efficient, and actually more complicated than this one.
The Tortoise and the Hare is possibly the most famous cycle detection algorithm, and is surprisingly straightforward. The Tortoise and the Hare are both pointers, and both start at the top of the list. For each iteration, the Tortoise takes one step and the
Hare takes two. If there is a loop, the hare will go around that loop (possibly more than once) and eventually meet up with the turtle when the turtle gets into the loop. If there is no loop, the hare will get to the end of the list without meeting up with
the turtle.
Why can't you just let the hare go by itself? If there was a loop, it would just go forever; the turtle ensues you will only take n steps at most.
For a somewhat more efficient algorithm, check out Brent's Cycle Detection Algorithm (The Teleporting Turtle).
伪码:
<pre name="code" class="python">
tortoise = top hare = top forever: if hare == end : return 'No Loop Found' hare = hare.next if hare == end : return 'No Loop Found' hare = hare.next tortoise = tortoise.next if hare == tortoise: return 'Loop Found'
我的代码:
class Solution(object): def hasCycle(self, head): """ :type head: ListNode :rtype: bool """ q = p = head while q and q.next: p = p.next q = q.next.next if p == q: return True return False
相关文章推荐
- Python动态类型的学习---引用的理解
- Python3写爬虫(四)多线程实现数据爬取
- 垃圾邮件过滤器 python简单实现
- 下载并遍历 names.txt 文件,输出长度最长的回文人名。
- install and upgrade scrapy
- Scrapy的架构介绍
- Centos6 编译安装Python
- 使用Python生成Excel格式的图片
- 让Python文件也可以当bat文件运行
- [Python]推算数独
- Python中zip()函数用法举例
- Python中map()函数浅析
- Python将excel导入到mysql中
- Python在CAM软件Genesis2000中的应用
- 使用Shiboken为C++和Qt库创建Python绑定
- FREEBASIC 编译可被python调用的dll函数示例
- Python 七步捉虫法