『题目测试样例有问题?』极限的应用

链表中环的入口节点

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』
      所以,我觉得我的应该是对的!!
全部评论

相关推荐

零OFFER战士:另一个版本查看图片
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务