LeetCode142.环形链表II
题目链接:https://leetcode-cn.com/problems/linked-list-cycle-ii/
题目描述:给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 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; } }
解法二:快慢指针
快指针一次2步,慢指针一次1步,当在环中相遇时,令慢指针回到头节点,此后快慢指针都一次走1步,再次相遇时就是入环节点(数学证明略)
public static ListNode detectCycle(ListNode head) { if (head == null || head.next == null||head.next.next==null){ return null; } ListNode fast = head.next.next; ListNode slow = head.next; //先判断链表是否有环 while (slow != fast){ if(fast == null || fast.next == null){ return null; } slow = slow.next; fast = fast.next.next; } //如果链表 有环, 令快指针回到头节点,然后两个指针一次走1步,再次相遇时,就是入环节点 fast = head; while (slow != fast){ fast = fast.next; slow = slow.next; } return slow; }
学习的博客多用于在笔记中,防止笔记过于臃肿,所以将样例及运行结果放在博客中,后以超链接的形式记录在笔记中,所以有些博文过于单薄。如果有小伙伴遇到问题欢迎评论,看到就会回复,学渣一枚,加油努力。