一、算法方案
1、快慢双指针法,快指针一次走两步,慢指针一次走一步,如果有环必会相遇
2、集合法
二、代码实现
1、快慢双指针法
//swift实现
public class ListNode {
public var val: Int
public var next: ListNode?
public init(_ val: Int) {
self.val = val
self.next = nil
}
}
func hasCycle(_ node: ListNode?) -> Bool {
if node == nil {
return false
}
var fast = node, slow = node
while fast != nil {
fast = fast?.next?.next
slow = slow?.next
if fast?.val == slow?.val {
return true
}
}
return false
}
//C++实现
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
bool hasCycle(ListNode *head) {
ListNode* slowerNode = head;
ListNode* fasterNode = head;
while(slowerNode != NULL && fasterNode != NULL && fasterNode->next != NULL){
slowerNode = slowerNode->next;
fasterNode = fasterNode->next->next;
if(slowerNode == fasterNode){
return true;
}
}
return false;
}
2、集合法
可以使用集合(Set)来判断,来一次遍历,把所有node添加到集合中,如果有重复,则肯定要有环