142. 环形链表 II

感情迁移 提交于 2020-02-13 17:03:17

该题旨在判断给定的链表是否存在环,若存在,则返回环的起始节点。

方法一:

利用哈希集记录已访问过的节点,当发生重复访问时,则表示链表中存在环,并返回第一个重复的节点,若没有发现重复元素,则表示该链表中没有换,返回null。

public class Solution {
    public ListNode detectCycle(ListNode head) {
        Set<ListNode> visited = new HashSet<ListNode>();
        ListNode node = head;
        while (node != null) {
            if (visited.contains(node)) {
                return node;
            }
            visited.add(node);
            node = node.next;
        }
        return null;
    }
}

方法二:

利用双指针法,慢指针一次后移一个节点,快指针一次后移两个节点;
当两个指针相遇时,令快指针指向头结点,并让两个指针都逐次后移一个节点;
当两个指针第二次相遇时,他们相遇的节点即为链表中环的起始节点。
该方法详细的数学分析过程可以参考文章:
环形链表 II(双指针法,清晰图解)

public class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode fast = head;
        ListNode slow = head;
        while(true){
            if(fast == null || fast.next == null){
                return null;
            }
            slow = slow.next;
            fast = fast.next.next;
            if(slow == fast)break;
        }
        fast = head;
        while(slow != fast){
            slow = slow.next;
            fast = fast.next;
        }
        return slow;
    }
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!