『题目测试样例有问题?』极限的应用
链表中环的入口节点
http://www.nowcoder.com/practice/6e630519bf86480296d0f1c868d425ad
思路『极限思维』
- 如图,假设『黄色部分的环足够大,导致,low指针从开始到相遇的红色点就走一次性到的,此时fast指针正好『第一回』重新追上!!也是在那』
- 导致公式成立:
- low=X+A
- fast=X+A+(B+A)
- 而我们发现,fast比low总是多走一倍,所以,我们发觉:fast=2*low
- 显然知道方程的答案是:B==X
- 所以,写出代码:
- low继续走,我们重新从起点发车一个low类型的指针,一定『第1回』就能在入口点相遇
面试时写的代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
//判断是否有环,有返回nullptr,否则返回相遇position
ListNode * isLoop( ListNode * head )
{
if( nullptr==head || nullptr==(head->next) )
{
return nullptr;
}
ListNode * low=head;
ListNode * fast=head;
while( nullptr!=low && nullptr!=fast )
{
low=low->next;
fast=fast->next;
if( nullptr==fast )
{
return nullptr;
}
fast=fast->next;
if( nullptr==fast )
{
return nullptr;
}
if( low==fast )
{
return low;
}
}
return nullptr;
}
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
if( nullptr==isLoop(head) )
{
return nullptr;
}
ListNode * pos=isLoop( head );
ListNode * Help=head;
while( 1 )
{
pos=pos->next;
Help=Help->next;
if( pos==Help )
{
return pos;
}
}
//给编译器吃
return nullptr;
}
}; 结果
我放在牛客上去测试,发现: 14/15 组用例通过 运行时间 11ms 占用内存 976KB 用例输入 {1,2},0 预期输出 1 实际输出 2 但是,这个样例我觉得有问题,1和2入口,都是一样的吧。 『解释如下:1连接到2,2连接到1』 所以,我觉得我的应该是对的!!
查看9道真题和解析