题目地址
https://leetcode.cn/problems/intersection-of-two-linked-lists/
题解
题解一(Java)
作者:@仲景
如果使用额外的内存空间来标识某一个链表的话,其实可以打表来实现
先将某一个链表的节点全部存到hash表中,然后遍历另一个链表,每次判断节点是否存在于hash表中,第一个存在的节点就是交点,不存在就会遍历完链表
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
// 如果链表有一个为空或者都为空,都不会存在交点
if (headA == null || headB == null)
return null;
// 创建hash表
Set<ListNode> set = new HashSet<>();
// 遍历链表A
ListNode node = headA;
// 把链表A所有节点都放到hash表中
while (node != null) {
set.add(node);
node = node.next;
}
// 遍历链表B
node = headB;
while (node != null) {
// 第一个存在于hash表的节点就是两个链表的交点
if (set.contains(node)) {
return node;
}
node = node.next;
}
// 不存在交点
return null;
}
}
题解二(Java)
作者:@仲景
假设链表A到交点的距离是lenA,链表B到交点的距离是lenB,交点之后的长度是lenC
如果两个链表存在交点的话,那么走完链表A+lenB和走完链表B+lenA的时候,会走到链表A和B的第一个交点上
求证:
为什么长度一致?
题解一的思路是通过判断两个链表长度来使得长链表和短链表到交点的距离一致,那么其实换位思考来讲,链表A多走lenB次,链表B多走lenA次,lenC是一个固定值,那这样两个链表的行进长度也是一致的
为什么相交的是第一个节点?
如果假设这个交点存在的话,从链表A开始走,交点一定是在lenA+lenC+lenB的长度上,链表B同理。如果不懂可以画图看看
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA == null || headB == null) {
return null;
}
ListNode nodeA = headA;
ListNode nodeB = headB;
while (nodeA != nodeB) {
nodeA = nodeA == null ? headB : nodeA.next;
nodeB = nodeB == null ? headA : nodeB.next;
}
return nodeA;
}
}