美文网首页
链表中环的入口节点

链表中环的入口节点

作者: dreamruner | 来源:发表于2018-11-07 11:16 被阅读5次

给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。

解法1:

新建一个HashSet,遍历链表,每次尝试添加当前遍历的节点到HashSet,如果添加失败,则代表HashSet中已经包含该节点,此时的节点即为环的入口点.

代码如下:

  public static ListNode solution1(ListNode pHead) {
        ListNode node = pHead;
        HashSet<ListNode> set = new HashSet<>();
        while (node != null) {
            if (!set.add(node)) {
                return node;
            }
            node = node.next;
        }
        return null;
    }

因为额外申请了内存,所以空间复杂度为O(n),时间复杂度为O(n)

解法2:

  1. 首先判断链表中是否有环,可以定义两个指针,一个每次走一步,一个每次走两步,如果快指针走到链表尾部时,两个指针没有相遇,则代表无环,否则说明又环.
  2. 确定环中节点的个数n.
  3. 将两个指针移动到链头,一个先走n步,然后两个指针一起走,如果两个指针相遇,则相遇点就是环的入口点.

代码如下:

 public static ListNode solution2(ListNode pHead) {

        ListNode fast = pHead;
        ListNode slow = pHead;
        while (fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;

            if (fast == slow) {
                fast = pHead;
                while (slow != fast) {
                    fast = fast.next;
                    slow = slow.next;
                }

                return slow;
            }
        }
        return null;
    }

此处并没有严格按照1,2,3的步骤,因为第一次两个指针相遇的节点处,就是3中先走的n步,假设slow指针走了x步,那么第一次相遇的时候,fast走了2x步,如果环中有n个节点,则fast比slow多走了n步,即2x-n=x,则x=n,所以两个指针第一次相遇的节点就是一个指针从链表头走了环中节点个数n步的位置.

这里并没有额外申请控件,只是用了两个指针变量,所以空间复杂度为O(1),时间复杂度为O(n)

代码的正确性可以到牛客网进行验证

牛客网剑指offer

相关文章

  • 链表中环的入口节点

    题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 思路 首先是判断链表中是否有...

  • 链表中环的入口节点

    给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 解法1: 新建一个HashSet,遍历...

  • 链表中环的入口节点

    题目描述 一个链表中包含环,请找出该链表的环的入口结点。 解法一: 要想知道环的入口节点,则必须至少经过该节点两次...

  • 链表中环的入口节点

    题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 第一想法 通过指针地址是否出...

  • 链表中环的入口节点

  • 链表中环的入口节点

    《剑指offer》面试题23:链表中环的入口节点 题目:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则...

  • 链表中环的入口节点

    题目:如果一个链表中包含环,如何找出环的入口节点? 解决这个问题的第一步是如何确定一个链表中包含环。定义两个指针,...

  • 剑指 offer:55、链表中环的入口节点

    55. 链表中环的入口节点 题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 ...

  • 23:链表中环的入口节点

    习惯github pages风格的请看我的另一篇博客 题目23:链表中环的入口节点 如果一个链表中包含环,请找出该...

  • 面试题23(剑指offer)--链表中环的入口节点

    题目: 给一个链表,若其中包含环,请找出该链表的环的入口结点。 思路: �链表中环的入口节点 先确定有环,用快慢指...

网友评论

      本文标题:链表中环的入口节点

      本文链接:https://www.haomeiwen.com/subject/okvmxqtx.html