环形链表 II
题目描述:
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环
说明:不允许修改给定的链表。
示例 1:
输入:head = [3,2,0,-4], pos = 1
输出:tail connects to node index 1
解释:链表中有一个环,其尾部连接到第二个节点。
示例 2:
输入:head = [1,2], pos = 0
输出:tail connects to node index 0
解释:链表中有一个环,其尾部连接到第一个节点。
示例 3:
输入:head = [1], pos = -1
输出:no cycle
解释:链表中没有环。
问题分析:
本题在环形链表的基础上增加的是 对具体环的入口处结点 的返回,一些基础思想可以点进去看一下,我在这里直接说方法
三种方法:
第一种:哈希表
使用Set 保存所有结点,遍历所有结点,对比是否出现过,出现过返回这个结点
第二种:Floyd 算法
两个阶段:
第一个阶段: 找出第一次相遇的结点
第二个阶段: 根据相遇的结点 设置两个指针(一个指向 head,另一个指向相遇点),两个指针同时寻找下一个结点,
当两个指针相遇,return 这个结点
第三种:Floyd算法的变形
快慢指针相遇点到入环点的距离 = 头结点到入环点的距离
代码展示(已验证):
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
第一种方法:Floyd 算法
public class Solution {
//第一种方法:Floyd 算法
// 第一阶段:寻找第一个相遇点
static ListNode getIntersect(ListNode head) {
ListNode tortoise =head;
ListNode hare = head;
while(hare != null & hare.next != null) { // 这个地方的 hare.next != null 还是会有问题,you du ...
tortoise = tortoise.next;
hare = hare.next.next;
if(tortoise == hare)
return tortoise;
}
return null;
}
// 第二阶段:根据相遇点找出入口
public ListNode detectCycle(ListNode head) {
if(head == null)
return null;
ListNode intersect = getIntersect(head);
if(intersect == null)
return null;
ListNode ptr1 = head;
ListNode ptr2 = intersect;
while(ptr1 != ptr2)
{
ptr1 = ptr1.next;
ptr2 = ptr2.next;
}
return ptr1;
}
第二种方法:哈希表
// 第二种方法:哈希表
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;
第三种方法:Floyd 算法的变形
// 第三种方法:Floyd 算法的变形:快慢指针相遇点到入环点的距离 = 头结点到入环点的距离
ListNode slow = head;
ListNode fast = head;
while(fast != null && fast.next != null) // 报错...........
{
slow = slow.next;
fast = fast.next.next;
if(slow == fast)
{
slow = head;
while(slow != fast)
{
slow = slow.next;
fast = fast.next;
}
return slow;
}
}
return null;
}
泡泡:
提交的时候,并没有提交上去,三个方法在同一个地方报错,应该是和ListNode 类的定义有关