142. 环形链表 II
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode detectCycle(ListNode head) {
if (head == null) {
return null;
}
ListNode fast=head;
ListNode low=head;
while(fast!=null){
low = low.next;
if(fast.next!=null){
fast=fast.next.next;
}
else {
return null;
}
if(fast==low){
ListNode ptr=head;
//当发现 low与fast 相遇时,我们再额外使用一个指针ptr。起始,它指向链表头部;随后,它和slow 每次向后移动一个位置。最终,它们会在入环点相遇。
while(ptr!=low){
low=low.next;
ptr=ptr.next;
}
return ptr;
}
}
return null;
}
}
160. 相交链表
判断两个链表是否相交,可以使用哈希集合存储链表节点。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
Set<ListNode> set=new HashSet<ListNode>();
ListNode cur=headA;
while(cur!=null){
set.add(cur);
cur=cur.next;
}
ListNode tmp=headB;
while(tmp!=null){
if(set.contains(tmp)){
return tmp;
}
tmp=tmp.next;
}
return null;
}
}