每日一题——带环链表

判断链表是否带环。
若带环求环的长度。
若带环求环的入口处。

并计算上述问题的时间复杂度

求环的入口处(前面几行代码证明带环)
至于环的长度,从之前的推论可知,链表起始到环的入口的距离等于相遇点走到环入口的距离,所以环的长度就等于链表起始点到相遇点的距离(代码中的count)。


  ListNode *detectCycle(ListNode *head) {
        // write your code here
        ListNode* begin = head;
        ListNode* last = head;
        if(head == NULL || head->next == NULL)
        {
            return NULL;
        }
        int count = 0;  
        while(begin->next != NULL && begin->next->next != NULL)
        {
            begin = begin->next->next;
            last = last->next;
            count++;   //记录到相遇点的距离,即环长
            if(begin == last)   //相遇点
                {
                    ListNode* newBegin = head;
                    ListNode* newLast = begin;
                    while(newBegin != newLast)
                    {
                        newBegin = newBegin->next;
                        newLast = newLast->next;
                    }
                    return newBegin;
                }
        }
        return NULL;
    }

这里写图片描述

时间复杂度:
1>:O(N)
2>:O(N)
3>:O(N^2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值