题解 | #链表中环的入口结点#

链表中环的入口结点

http://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4

集合/哈希

这里用set就可以达到哈希效果,如果有环,那么第一个出现在集合中的重复元素就是环的入口。
(如果使用哈希,发现第一个哈希值为2的就是环的入口)

class Solution {
public:
    ListNode* EntryNodeOfLoop(ListNode* pHead) {
        ListNode *cur = pHead;
        unordered_set<ListNode*> tmpS;
        while(cur != nullptr){// 没环从这里退出
            if(tmpS.count(cur) > 0){// 如果有环从这里退出
                return cur;
            }
            tmpS.insert(cur);
            cur = cur->next;
        }
        return nullptr;
    }
};

时间复杂度:O(n)
空间复杂度:O(n)

双指针法

  1. 初始快慢指针,指向链表头节点
  2. 快指针每次向后移动两步,满指针每次移动一步(如果链表有环,那么快慢指针一定会相等)
  3. 如果快慢指针快慢指针不等且遍历到了尾结点返回null,如果快慢指针相等,那么将快指针移动到链表表头,快指针速度变慢每次移动一步,同时移动两个指针,下次相遇的位置就是环的入口。
    链表环入口节点快慢指针
    class Solution {
    public:
     ListNode* EntryNodeOfLoop(ListNode* pHead) {
                 if(pHead == nullptr)
             return nullptr;
         ListNode *fast = pHead, *slow = pHead;
         while(fast != nullptr && fast->next != nullptr){
             slow = slow->next;
             fast = fast->next->next;
             if(slow == fast)
                 break;
         }
         if(slow != fast || fast->next == nullptr)
             return nullptr;
         fast = pHead;
         while(fast != slow){
             slow = slow->next;
             fast = fast->next;
         }
         return fast;
     }
    };
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-15 17:46
暑期就挂了,秋招还有机会吗
大聪明777:研发提前批,14号刚开的,官网上面的配图上有写。提前批没过的话,秋招还可以投,不过前面的笔试/面试记录会被保留,供秋招参考
26届校招投递进展
点赞 评论 收藏
分享
tttk_:就是人多。 有的是条件和你差不多然后没在od待过的人。 所以就拿这个筛你了。 就和卡学历一样,人太多了。 从公司角度,这样做节省精力,更方便。 没办法谁叫现在人多呢
第一份工作能做外包吗?
点赞 评论 收藏
分享
门口唉提是地铁杀:之前b站被一个游戏demo深深的吸引了。看up主页发现是个初创公司,而且还在招人,也是一天60。二面的时候要我做一个登录验证和传输文件两个微服务,做完要我推到github仓库,还要我加上jaeger和一堆运维工具做性能测试并且面试的时候投屏演示。我傻乎乎的做完以后人家跟我说一句现在暂时不招人,1分钱没拿到全是白干
你的秋招第一场笔试是哪家
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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