发布于 

剑指 Offer.52-两个链表的第一个公共节点

剑指 Offer.52-两个链表的第一个公共节点

题目链接

https://leetcode-cn.com/problems/liang-ge-lian-biao-de-di-yi-ge-gong-gong-jie-dian-lcof/

问题描述

输入两个链表,找出它们的第一个公共节点

个人想法

通过hashSet记录一条链表的访问节点,遍历第二条节点,当出现重复元素时即证明出现重复节点,经编程尝试,无法通过用例1,是因为hashSet会覆盖掉相同元素的节点,任意链表非公共部分与公共部分存在相同元素时,会出现错误,故此法无法通过

官方解法

使用两个指针同时对链表进行遍历,当任意一条节点遍历到头时,从另一条节点的头部开始继续遍历,当两个节点到相同位置时,停止遍历并返回

A =[4,1,8,4,5],B=[5,0,1,8,4,5],将链表的公共部分的长度记为cA链表的非公共长度为a-cB链表的非公共长度为b-c,按照以上遍历的方案,B的遍历至第一个公共节点长度为(a-c)+b,A的遍历至第一个公共节点的总长度为(b-c)+a,两指针终会在第一个公共节点相遇。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
//在本地中简单使用hashSet连用例1都无法通过
//双指针同时移动 当一个指针走完的时候 从另一个指针的头部接上
ListNode ptA = headA;
ListNode ptB = headB;

while(ptA != ptB){
if(ptA == null){
ptA = headB;
}else{
ptA = ptA.next;
}

if(ptB == null){
ptB = headA;
}else{
ptB = ptB.next;
}
}
return ptA;
}
}

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

本站由 @John Doe 创建,使用 Stellar 作为主题。