leetcode java_LeetCode 160. Java版代码(附详细解释)

题目描述

给定两个链表,请找它们的交汇点。

如果两个链表不相交,则返回 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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值