经典算法 | 判断任意长度链表是否有环的O(n)时间,O(1)空间算法
2018-01-16 12:59
399 查看
题目是判断链表里面是否有循环,可以使用快慢指针解决,实际上只要是判断循环的题目都可以使用快慢指针解决,
慢指针每一次走一格,快指针每一次走两格,当快指针为null的时候肯定不存在循环了,当链表中有循环则一定有一次循环会使得快指针等于慢指针
计算出环所需要的总步数为,慢指针走到循环入口处所需要的步数和这个时候快指针和慢指针的距离的和(因为在环里面慢指针每次走一步,快指针每次走两步,他们的距离每次缩短一),为step<=n,所以总时间为O(n)
class Solution {
public:
bool hasCycle(ListNode *head) {
if (head == NULL) return false;
ListNode * slow = head;
ListNode * fast = slow->next;
while (fast != NULL && fast->next != NULL)
{
if (fast == slow) return true;
slow = slow->next;
fast = fast->next->next;
}
return false;
}
};
慢指针每一次走一格,快指针每一次走两格,当快指针为null的时候肯定不存在循环了,当链表中有循环则一定有一次循环会使得快指针等于慢指针
计算出环所需要的总步数为,慢指针走到循环入口处所需要的步数和这个时候快指针和慢指针的距离的和(因为在环里面慢指针每次走一步,快指针每次走两步,他们的距离每次缩短一),为step<=n,所以总时间为O(n)
class Solution {
public:
bool hasCycle(ListNode *head) {
if (head == NULL) return false;
ListNode * slow = head;
ListNode * fast = slow->next;
while (fast != NULL && fast->next != NULL)
{
if (fast == slow) return true;
slow = slow->next;
fast = fast->next->next;
}
return false;
}
};
相关文章推荐
- 郝斌数据结构 25 判断链表是否为空和求链表长度算法的演示
- 判断链表是否带环?若带环求环的长度?若带环求环的入口点?并计算以上每个问题的时间复杂度?
- 链表插入和删除,判断链表是否为空,求链表长度算法的,链表排序算法演示——C语言描述
- 长度为n的整数数组,找出其中任意(n-1)个乘积最大的那一组,只能用乘法,不可 以用除法。要求对算法的时间复杂度和空间复杂度作出分析,可以写思路也可以写程序。
- [算法练习FindLoop]判断单向链表是否存在循环/循环入口/环长度
- 给定一个单向链表(长度未知),请设计一个既节省时间又节省空间的算法来找出该链表中的倒数第m个元素。实现这个算法,并为可能出现的特例情况安排好处理措施。“倒数第m个元素”是这样规定的:当m=0时,链表的
- 【郝斌数据结构自学笔记】25_判断链表是否为空和求链表长度算法的演示
- 【算法之链表(一)】判断单链表中是否有环、环的长度、环的入口节点,单链表的倒数第K个节点等
- 笔试面试算法经典--判断二叉树是否是平衡二叉树(Java)
- 面试-链表逆置 作业手写一个单链表,并且实现单链表元素的逆置,(a0, a1,a2,a3,..an)-> (an,an-1,… a1, a0),算法的空间复杂度和时间复杂度经可能低
- 从数组中任意取出2个数,判断他们的和是否为输入的数字sum,时间复杂度为0(n^2),空间复杂度0(1)
- 一个运行时间为nlgn的算法,能判断在集合S中是否有两数之和为x
- 算法题006 判断两个链表是否相交
- 判断一个整数数组中是否有重复数字出现的O(n)时间复杂度算法
- 经典算法面试题目-判断两个字符串是否是变位词(1.4)
- 算法--判断链表是否有环
- 算法学习 - 链表之归并排序_O(1)空间_O(NlogN)时间_C++
- 判断一个单向链表是否有环,算法证明
- 经典算法 | 计算几何 | 判断点是否在多边形内部两个算法
- objective-c判断点是否在多边形内(包括在多边形上)的一个经典算法