142. 环形链表 II
- 我的思路
- 代码优化
力扣142题
我的思路
遍历链表,每遍历一个节点都+1,第一个变为2的索引就是环的入口。二维数组(节点索引,计数)。可以用hashmap实现。
遇到的问题:HashMap<ListNode,Integer> map 问题出在不能重复添加,可以用try catch?
解决方式是用 containsKey 方法,“如果此映射包含指定键的映射,则返回 true ”。
public class Solution {
public ListNode detectCycle(ListNode head) {
HashMap<ListNode,Integer> map = new HashMap<>();
ListNode cur = head;
while(cur != null) {
if(map.containsKey(cur)) {
return cur;
}
map.put(cur,1);
cur = cur.next;
}
return null;
}
}
我发现其实可以用 ArrayList,它也有一个方法 contains:查找元素是否存在。
public class Solution {
public ListNode detectCycle(ListNode head) {
List mylist = new ArrayList();
ListNode cur = head;
while(cur != null) {
if(mylist.contains(cur)) {
return cur;
}
mylist.add(cur);
cur = cur.next;
}
return null;
}
}
代码优化
参考代码随想录
本题暗含两个问题①是否有环②环的起点
①是否有环
快慢指针:在环里相遇,且块指针先进入环。
慢指针每次走一步,快指针每次走两步,这样才不会跳过,如果快指针走三步就有可能跳过慢指针。
②环的起点
数学方法。