资讯专栏INFORMATION COLUMN

leetcode141-142. Linked List Cycle I & II

张巨伟 / 2090人阅读

摘要:题目要求这道题目要求判断一个链表中是否有环,如果有环,就返回环中的第一个节点。如果有环,就会重复遇到这个指向的节点。则该链表有环,且该节点就是环的起始节点。但是这个方法会毁坏原来链表的数据结构。

题目要求
Given a linked list, return the node where the cycle begins. If there is no cycle, return null.

Note: Do not modify the linked list.

Follow up:
Can you solve it without using extra space?

这道题目要求判断一个链表中是否有环,如果有环,就返回环中的第一个节点。

判断是否有环

判断是否有环有两种方法,第一种是双指针的方法,双指针方法意味着快指针一定有一天会遇上慢指针,只要链表中有环。

    public boolean hasCycle(ListNode head) {
        if(head==null) return false;
        ListNode walker = head, runner = head;
        while(runner.next!=null && runner.next.next!=null){
            walker = walker.next;
            runner = runner.next.next;
            if(walker==runner) return true;
        }
        return false;
    }

还有一种方法是指将链表的结果给拆掉,一旦遍历过当前节点,就将当前节点的下一个指针指向dummy节点。如果有环,就会重复遇到这个指向dummy的节点。则该链表有环,且该节点就是环的起始节点。但是这个方法会毁坏原来链表的数据结构。

    public boolean hasCycle2(ListNode head){
        if(head==null) return false;
        ListNode dummy = new ListNode(0);
        while(head.next!=null){
            if(head.next==dummy)return true;
            ListNode temp = head.next;
            head.next = dummy;
            head = temp;
        }
        return false;
    }
找到环的起始节点

那么如何才能在环中找到起始节点呢?这就要找出双指针之间运动的规律了。当快慢指针第一次相遇时,我们假设慢指针和环中第一个节点距离为X,而环中第一个节点距离起始节点为Y。而因为快指针在走了一圈以后也停留在该节点,因此快指针走过的总距离为(X+Y)*2。又因为快慢指针相遇决定了快指针比慢指针多走了一圈,因此2(X+Y)-(X+Y)=CYCLE,也就是X+Y=CYCLE这时我们可以知道如果再走Y步,慢指针就可以回到环中的第一个节点,而Y也恰好是环中第一个节点距离起始节点的位置。因此如果这时有另一个指针同时从起点出发,则二者相遇的地方就是环的起始节点。

    public ListNode detectCycle(ListNode head) {
        if(head==null) return null;
        ListNode runner = head, walker = head;
        while(runner.next!=null && runner.next.next!=null){
            walker = walker.next;
            runner = runner.next.next;
            if(walker==runner){
                ListNode temp = head;
                while(temp!=walker){
                    temp = temp.next;
                    walker = walker.next;
                }
                return temp;
            }
        }
        
        return null;
    }


想要了解更多开发技术,面试教程以及互联网公司内推,欢迎关注我的微信公众号!将会不定期的发放福利哦~

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70230.html

相关文章

  • [LintCode] Linked List Cycle I & II

    摘要:做法如果有环,快慢指针必定可以相遇。而让此时重新从起点出发,以和相同的速度,需要走非环路的直线长度,才能到达环的起点。也就是说,,就是第二个循环结束的条件。 Linked List Cycle I Problem Given a linked list, determine if it has a cycle in it. Example Given -21->10->4->5, ta...

    用户83 评论0 收藏0
  • LeetCode 之 JavaScript 解答第142题 —— 环形链表 IILinked Li

    摘要:说明不允许修改给定的链表。算法思路题目要求返回单链表中存在循环链表的位置。首先,先判断该单链表是否存在循环链表用两个快慢指针分别指向链表的头部,每次移动两步,每次移动一步,移动的步数是的两倍。 Time:2019/4/8Title: Linked List Cycle IIDifficulty: mediumAuthor:小鹿 题目:Linked List Cycle II Giv...

    whidy 评论0 收藏0
  • LeetCode 142:环形链表 II Linked List Cycle II

    摘要:如果链表无环,则返回。说明不允许修改给定的链表。示例输入输出解释链表中有一个环,其尾部连接到第一个节点。两种方法哈希表哈希表添加节点时只要发现节点已经存在了,证明就有环形链表。 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该...

    hoohack 评论0 收藏0
  • LeetCode 142:环形链表 II Linked List Cycle II

    摘要:如果链表无环,则返回。说明不允许修改给定的链表。示例输入输出解释链表中有一个环,其尾部连接到第一个节点。两种方法哈希表哈希表添加节点时只要发现节点已经存在了,证明就有环形链表。 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该...

    geekzhou 评论0 收藏0
  • [LeetCode] Reverse Linked List I & II

    Reverse Linked List Reverse a singly linked list. Note Create tail = null; Head loop through the list: Store head.next, head points to tail, tail becomes head, head goes to stored head.next; Return t...

    jcc 评论0 收藏0

发表评论

0条评论

张巨伟

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<