CodeACM
HOT 100 · 链表 · LC 160

相交链表:ACM 模式刷题

按标准输入读取测试数据,输出结果后可在 CodeACM 在线运行和提交。

题目描述

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。

图示两个链表在节点 c1 开始相交:

题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构 。

自定义评测:

评测系统 的输入如下(你设计的程序 不适用 此输入):

· intersectVal - 相交的起始节点的值。如果不存在相交节点,这一值为 0

· listA - 第一个链表

· listB - 第二个链表

· skipA - 在 listA 中(从头节点开始)跳到交叉节点的节点数

· skipB - 在 listB 中(从头节点开始)跳到交叉节点的节点数

评测系统将根据这些输入创建链式数据结构,并将两个头节点 headA 和 headB 传递给你的程序。如果程序能够正确返回相交节点,那么你的解决方案将被 视作正确答案 。

输入格式

第一行输入三个整数 a、b、c,分别表示链表 A 的独有前缀长度、链表 B 的独有前缀长度和两条链表共享的公共后缀长度。

第二行输入 a 个整数,表示链表 A 在交点前独有的节点值。

第三行输入 b 个整数,表示链表 B 在交点前独有的节点值。

第四行输入 c 个整数,表示两条链表从交点开始共享的公共后缀节点值。若 c = 0,表示两条链表不相交;长度为 0 的行可以为空行。

输出格式

若存在公共节点,输出公共后缀第一个节点的值;否则输出 null。

数据范围

  • 0 ≤ a, b, c ≤ 3 × 10⁴
  • 1 ≤ a + b + c ≤ 10⁵
  • 1 ≤ 节点值 ≤ 10⁵

公开样例

样例 1

输入

2 3 3
4 1
5 6 1
8 4 5

输出

8

第一行 2 3 3 表示:A 独有 2 个节点,B 独有 3 个节点,公共后缀有 3 个节点。A 独有部分是 4 → 1,B 独有部分是 5 → 6 → 1,公共后缀是 8 → 4 → 5。因此链表 A 为 4 → 1 → 8 → 4 → 5,链表 B 为 5 → 6 → 1 → 8 → 4 → 5,并且从值为 8 的节点开始是同一段公共节点,所以输出 8。

样例 2

输入

3 1 2
1 9 1
3
2 4

输出

2

第一行 3 1 2 表示:A 独有 3 个节点,B 独有 1 个节点,公共后缀有 2 个节点。公共后缀是 2 → 4,所以两条链表从值为 2 的同一个节点开始相交。

练习建议

先根据输入输出格式写出可运行程序,再用公开样例检查结果;遇到边界情况时,补充自测用例后提交。