- 相交链表
编写一个程序,找到两个单链表相交的起始节点。
public class Solution {
public ListNode getIntersectionNode(ListNode ha, ListNode hb) {
HashSet<ListNode> set = new HashSet<>();
if(ha == null || hb == null) return null;
while(ha != null){
set.add(ha);
ha = ha.next;
}
while(hb != null){
if(set.contains(hb)) return hb;
hb = hb.next;
}
return null;
}
}
A和B两个链表长度可能不同,但是A+B和B+A的长度是相同的,所以遍历A+B和遍历B+A一定是同时结束。 如果A,B相交的话A和B有一段尾巴是相同的,所以两个遍历的指针一定会同时到达交点 如果A,B不相交的话两个指针就会同时到达A+B(B+A)的尾节点
public class Solution {
public ListNode getIntersectionNode(ListNode ha, ListNode hb) {
if(ha == null || hb == null) return null;
//原始头结点变量还是要保存一下的
ListNode ra = ha, rb = hb;
while(ha != hb){
ha = ha.next;
hb = hb.next;
if(ha == null && hb == null) return null;
//注意这句必须得放在前面,不然会超时的,因为要提前判断
if(ha == null) ha = rb;
if(hb == null) hb = ra;
}
return ha;
}
}