思路:快慢指针来解决,如果有环,那么最后肯定会是node1==node2
思路:
利用快慢指针 slow = slow.next;
fast = fast.next.next;
注意循环条件 while(fast != null && fast.next != null)
因为涉及到fast.next.next,所以需要判定fast.next是否为空
我大概看了一下没有我这么做的,我的方法更暴力简单,每次遍历一个数据,就把那个节点的val值换成None,然后一直遍历直到遇到节点为None或者节点的val为None为止,因为输入里似乎没有val为None的情况,所以直接判断退出循环的原因即可判断。
快慢指针,时间空间均超过了90%,不知道代码还能不能简化一下
两个指针,一个一次走一步,一个一次走两步,两个指针相遇的话就是有环
解法1:殊途同归法
解法2:快慢指针
啊这,在没有考虑输入链表为空的时候,他会报段错误。所以这个要小心,并不是自己代码有问题,可能是测试用例中使用了非法输入,所以要小心。新手刚开始刷题的我,确实被自己气到。
快慢指针,如果有环两个指针一定会相遇。如果快指针的next碰见null或者next的next碰见null就是没有环。
/*
快慢指针,从头走,一个走一步,一个走两步,如果有环,则快指针会在环内再次追上慢指针,
即快慢指针会相遇,否则会有指针指到null,即走到结尾。
*/
方法一:通过常规快慢指针判断
方法二:使用列表判断是否下一步保存值在里面,会牺牲空间
#include <stdbool.h>
/**
- struct ListNode {
- int val;
- struct ListNode *next;
- };
- C语言声明定义全局变量请加上static,防止重复定义
*/
/**
*
-
@param head ListNode类
-
@return bool布尔型
/
bool hasCycle(struct ListNode head ) {
// write code here
struct ListNode *slow=head,*fast=head;
while(){if(){ return true; }
}
return false;
}
#include <stdbool.h>
/**
- struct ListNode {
- int val;
- struct ListNode *next;
- };
- C语言声明定义全局变量请加上static,防止重复定义
*/
/**
*
- @param head ListNode类
- @return bool布尔型
/
bool hasCycle(struct ListNode head ) {
// write code here
struct ListNode *slow=head,*fast=head;
while(fast&&fast->next){
slow=slow->next;
fast=fast->next->next;
if(slow==fast){
return true;
}
}
return false;
}