码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode_141_ Linked List Cycle

时间:2015-02-16 11:43:26      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:linked_list   c++   leetcode   

欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢技术分享


 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^2)的方法,但是超时了,使用两个指针a, b。a从表头开始一步一步往前走,遇到null则说明没有环,返回false;a每走一步,b从头开始走,如果遇到b==a.next,则说明有环true,如果遇到b==a,则说明暂时没有环,继续循环。

后来使用复杂度O(n)的方法:使用两个指针slow,fast。两个指针都从表头开始走,slow每次走一步,fast每次走两步,如果fast遇到null,则说明没有环,返回false;如果slow==fast,说明有环,并且此时fast超了slow一圈,返回true。

分析:为什么有环的情况下二者一定会相遇呢?因为fast先进入环,在slow进入之后,如果把slow看作在前面,fast在后面每次循环都向slow靠近1,所以一定会相遇,而不会出现fast直接跳过slow的情况。


//复杂度O(n)的方法:使用两个指针slow,fast。两个指针都从表头开始走,slow每次走一步,fast每次走两步,如果fast遇到null,则说明没有环,返回false;如果slow==fast,说明有环,并且此时fast超了slow一圈,返回true。
//
//分析:为什么有环的情况下二者一定会相遇呢?因为fast先进入环,在slow进入之后,如果把slow看作在前面,fast在后面每次循环都向slow靠近1,所以一定会相遇,而不会出现fast直接跳过slow的情况。

class Solution {
public:
    bool hasCycle(ListNode *head) {
		ListNode *fast=head;
		ListNode *slow=head;
		while( fast && slow )
		{
			fast = fast->next;
			if(fast)
				fast = fast->next;
			else 
				break;
			slow = slow->next;

			if( fast == slow )
				return true;
		}
		return false;

    }
};


leetcode_141_ Linked List Cycle

标签:linked_list   c++   leetcode   

原文地址:http://blog.csdn.net/keyyuanxin/article/details/43850927

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!