【LeetCode每日一题】[中等]142. 环形链表 II
142. 环形链表 II
题目来源
算法思想:链表,指针,哈希表
题目:
今天的题目描述,一言难尽,
题目: 给定一个链表,返回环起的节点
思路.
java代码–哈希表
一个非常直观的思路是:我们遍历链表中的每个节点,并将它记录下来;一旦遇到了此前遍历过的节点,就可以判定链表中存在环。借助哈希表可以很方便地实现。
public class Solution {
//返回起环的节点
public ListNode detectCycle(ListNode head) {
Set<ListNode> m = new HashSet<ListNode>();//用来标记存在的节点
ListNode pos = head;//指针pos
while(pos != null) {
if (m.contains(pos)) {
//如果当前节点存在,即存在环,返回当前节点
return pos;
}
else {
//不存在,则将该节点加入哈希表
m.add(pos);
}
pos = pos.next;//指针下移
}
return null;
}
}
java代码–指针,赛跑
PS:赛跑的方法很巧妙,详细描述如下:
public class Solution {
//返回起环的节点
public ListNode detectCycle(ListNode head) {
ListNode fast = head;//快指针
ListNode slow = head;//慢指针
while(fast != null) {
if (fast.next != null) {
//快指针移动两格,慢指针移动一格
fast = fast.next.next;
slow = slow.next;
}
else {
return null;
}
if (fast == slow) {
//相遇,停止
break;
}
}
if (fast == null) {
//如果无环,返回null
return null;
}
ListNode pos = head;//有环
while (slow != pos) {
//同时移动,相遇于起环位置
pos = pos.next;
slow = slow.next;
}
return pos;//返回起环位置
}
}