1. PAT甲级真题-Sharing题目解析
这道题目来自PAT(Programming Ability Test)甲级考试,题目编号为"Sharing (25)",分值25分。PAT是由浙江大学计算机科学与技术学院主办的编程能力测试,其甲级考试难度相当于ACM/ICPC区域赛水平,主要考察数据结构和算法应用能力。
从题目名称"Sharing"可以推断,本题很可能涉及共享数据结构或资源的处理,典型场景包括:
- 链表节点的共享(两个链表在某节点后合并)
- 图的公共边或顶点
- 字符串的公共子串
- 树结构的公共祖先
结合PAT甲级真题的命题特点,这道题最可能考察的是链表公共节点的处理,这是数据结构中的经典问题。题目通常会给出两个链表的头节点,要求找出它们第一个共享的节点。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 链表公共节点问题的标准解法
2.1 问题定义
给定两个单向链表的头节点headA和headB,找出并返回两个链表相交的起始节点。如果两个链表没有交点,返回null。
要求:
- 时间复杂度O(n)
- 空间复杂度O(1)
- 不能改变链表原始结构
2.2 双指针解法原理
这是最优美的解法之一,通过两个指针同步遍历两个链表:
- 初始化指针pA和pB分别指向headA和headB
- 同时向前移动两个指针
- 当pA到达链表末尾时,重定位到headB;同理pB到达末尾时重定位到headA
- 当pA和pB相遇时,即为第一个公共节点
这种方法的正确性基于数学原理:两个指针走过的总路径长度相同(a+b+c),因此必然在交点相遇。
cpp复制ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode *pA = headA, *pB = headB;
while (pA != pB) {
pA = pA ? pA->next : headB;
pB = pB ? pB->next : headA;
}
return pA;
}
2.3 哈希表解法
虽然不符合O(1)空间要求,但也是常见思路:
- 遍历链表A,将所有节点地址存入哈希表
- 遍历链表B,检查每个节点是
