leetcode 142. 环形链表 2

哈哈,这题和环形链表1差不多 ,链表1详情参见  https://blog.****.net/a66666_/article/details/105211023

解法1. 快慢指针 (建议不要直接复制到leetcode,会报错,自己手打一遍)

时间复杂度O(N)  空间复杂度O(1)

 

public ListNode detectCycle(ListNode head) {

        ListNode walker = head;

        ListNode runner = head;

        while (runner != null && runner.next != null) {

            walker = walker.next;

            runner = runner.next.next;

            if (walker == runner) {

                ListNode walker2 = head;

                while (walker != walker2) {

                    walker = walker.next;

                    walker2 = walker2.next;

                }

                return walker;

            }

        }

        return null;

    }

相比 环形链表1的解法多了下方的代码

ListNode walker2 = head;

                while (walker != walker2) {

                    walker = walker.next;

                    walker2 = walker2.next;

                }

因为环形链表1快慢指针相遇的节点并不是连接的那个节点

leetcode 142. 环形链表 2

如图所示,p为快慢指针相遇节点,q为连接节点,而连接节点由公式 a+2b+c == 2(a+b)可推出a == c

解法二:哈希表

时间复杂度O(N),空间复杂度O(N)

 

public ListNode detectCycle(ListNode head) {

        Set<ListNode> node = new HashSet<ListNode>();

        while (head != null) {

            if (node.contains(head)) {

                return head;

            }

            node.add(head);

            head = head.next;

        }

        return null;

    }