#160. 相交链表
难度:简单
题目描述
解题思路
1、根据长度调整开始遍历的位置
先遍历一遍找出各自长度,然后根据长度差调整指针位置,再依次遍历看是否到了交叉节点。虽然看起来没那么秀但是提交结果还不错
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode p = headA,q = headB;
int n1 = 0,n2 = 0;
while(p != null) {
n1++;
p = p.next;
}
while(q != null) {
n2++;
q = q.next;
}
p = headA;q = headB;
while(n1 > n2) {
p = p.next;
n1--;
}
while(n2 > n1) {
q = q.next;
n2--;
}
while(p != null && q != null) {
//System.out.println(p.val+" "+q.val);
if(p == q) {
return p;
}
p = p.next;
q = q.next;
}
return null;
}
2、人工制造环路(据说是个爱情故事?)
参考题解(视频好棒哈哈):教你用浪漫的方式找到两个单链表相交的起始节点
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA == null || headB == null)
return null;
ListNode p = headA,q = headB;
while(p != q) {
p = p==null?headB:p.next;
q = q==null?headA:q.next;
}
return p;
}
p和q总是一起前进,第一次指向一个表头的时候消除了长度差,
a ----c------
b--------c------
p遍历的长度a+c+b
q遍历的长度b+c+a,最后这两个总会相遇,要么在交点,要么最后都等于null.