地址:http://oj.leetcode.com/problems/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?
思路:两个指针都指向头节点,一个步进为1,一个步进为2,如果有环,两个指针会相等。还记得小学数学题在环形操场上跑步小明比小红跑的快问小明和小红下次在什么时候再相遇吗,一个道理噢。
注意判断指针是否为空。
参考代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
bool hasCycle(ListNode *head) {
ListNode *p1, *p2;
p1 = head;
if(!head)
return false;
p2 = p1->next;
while(p1 && p2 && p1 != p2)
{
p1 = p1->next;
p2 = p2->next;
if(p2)
p2=p2->next;
}
if(!p1 || !p2)
{
return false;
}
return true;
}
};
python:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
# @param head, a ListNode
# @return a boolean
def hasCycle(self, head):
if not head : return False
h1 = h2 = head
while True:
h1 = h1.next
if h2: h2 = h2.next
else: return False
if h2: h2 = h2.next
else: return False
if h1 == h2:
return True
SECOND TRIAL
class Solution {
public:
bool hasCycle(ListNode *head) {
if(!head)
return false;
ListNode*p = head, *q = head;
do{
p = p->next;
if(p)
p = p->next;
q = q->next;
}while(p && p!=q);
return p;
}
};