题目描述
给定两个链表,请找它们的交汇点。
如果两个链表不相交,则返回 null;
在函数结束时,两个链表必须保持原来的结构;
链表中不存在环;
你的代码需要的时间复杂度是 O(n),额外的空间复杂度是 O(1);
样例
给定如下两个链表:
A: a1 → a2
↘
c1 → c2 → c3
↗
B: b1 → b2 → b3
则交汇点是 c1。
Java 代码
长文预警!
代码不多,但是后面附有详细的解释,diagram搬运自leetcode大神@ BryanBo-Cao的评论。
时间复杂度分析:
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA==null || headB == null) return null;
ListNode a = headA;
ListNode b = headB;
while(a!=b){
a = a == null ? headB : a.next;
b = b == null ? headA : b.next;
}
return a;
}
Case 1 (相同长度有交点)
a
A: a1 → a2 → a3
↘
c1 → c2 → c3 → null
↗
B: b1 → b2 → b3
b
a
A: a1 → a2 → a3
↘
c1 → c2 → c3 → null
↗
B: b1 → b2 → b3
b
a
A: a1 → a2 → a3
↘
c1 → c2 → c3 → null
↗
B: b1 → b2 → b3
b
A: a1 → a2 → a3
↘ a
c1 → c2 → c3 → null
↗ b
B: b1 → b2 → b3
此时a == b 符合, 退出while循环,a=c1
Case 2 (不同长度,有交点):
a
A: a1 → a2
↘
c1 → c2 → c3 → null
↗
B: b1 → b2 → b3
b
a
A: a1 → a2
↘
c1 → c2 → c3 → null
↗
B: b1 → b2 → b3
b
A: a1 → a2
↘ a
c1 → c2 → c3 → null
↗
B: b1 → b2 → b3
b
A: a1 → a2
↘ a
c1 → c2 → c3 → null
↗ b
B: b1 → b2 → b3
A: a1 → a2
↘ a
c1 → c2 → c3 → null
↗ b
B: b1 → b2 → b3
A: a1 → a2
↘ a = null, then a = b1
c1 → c2 → c3 → null
↗ b
B: b1 → b2 → b3
A: a1 → a2
↘
c1 → c2 → c3 → null
↗ b = null, then b = a1
B: b1 → b2 → b3
a
b
A: a1 → a2
↘
c1 → c2 → c3 → null
↗
B: b1 → b2 → b3
a
b
A: a1 → a2
↘
c1 → c2 → c3 → null
↗
B: b1 → b2 → b3
a
A: a1 → a2
↘ b
c1 → c2 → c3 → null
↗ a
B: b1 → b2 → b3
此时a == b 符合, 退出while循环,a=c1
Case 3 (无交点 &相同长度):
a
A: a1 → a2 → a3 → null
B: b1 → b2 → b3 → null
b
a
A: a1 → a2 → a3 → null
B: b1 → b2 → b3 → null
b
a
A: a1 → a2 → a3 → null
B: b1 → b2 → b3 → null
b
a = null
A: a1 → a2 → a3 → null
B: b1 → b2 → b3 → null
b = null
a==b符合,返回a=null
Case 4 (无交点,不同长度):
a
A: a1 → a2 → a3 → a4 → null
B: b1 → b2 → b3 → null
b
a
A: a1 → a2 → a3 → a4 → null
B: b1 → b2 → b3 → null
b
a
A: a1 → a2 → a3 → a4 → null
B: b1 → b2 → b3 → null
b
a
A: a1 → a2 → a3 → a4 → null
B: b1 → b2 → b3 → null
b = null, then b = a1
b a = null, then a = b1
A: a1 → a2 → a3 → a4 → null
B: b1 → b2 → b3 → null
b
A: a1 → a2 → a3 → a4 → null
B: b1 → b2 → b3 → null
a
b
A: a1 → a2 → a3 → a4 → null
B: b1 → b2 → b3 → null
a
b
A: a1 → a2 → a3 → a4 → null
B: b1 → b2 → b3 → null
a
b = null
A: a1 → a2 → a3 → a4 → null
B: b1 → b2 → b3 → null
a = null
符合a==b, return a = null.