持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第24天,点击查看活动详情
题目
输入两个链表,找出它们的第一个公共节点。
解题思路
关键词:链表;公共节点;长度不同
关键信息:公共重合链表结构;存在或不存在相同节点
哈希解法
哈希解法思路:先遍历其中一个链表并存下整个链表每个节点。然后再遍历另外一个链表找到是否存在相同节点输出。
- 先创建一个哈希表来保存链表节点。
- 循环一个链表并存下节点。
- 再循环另外一个链表判断是否存在相同节点。
- 执行contains包含该节点就返回结果。
ListNode getIntersectionNode(ListNode headA, ListNode headB) {
Set<ListNode> nodes = new HashSet<ListNode>();
ListNode temp = headA;
while (temp != null) {
nodes.add(temp);
temp = temp.next;
}
ListNode temp2 = headB;
while(temp2 != null){
if(nodes.contains(temp2)){ // 是否有一样的值
return temp2;
}
temp2 = temp2.next;
}
return null;
}
双指针解法
双指针解法思路可以理解为龟兔赛跑算法(当两个链表长度不一致的时候)。
- 如果两个链表长度一样的话,到链表尾部同时指向null,结果为null。
- 如果两个链表长度不一样,那么当链表循环到尾部后切换为另外一个链表进行循环。
- 比如链表a长度为x,链表b长度为y,他们若有公共节点链表结构应该是x = aa +c;y = bb +c;
- c是他们公共节点长度,aa和bb是他们前置节点内容。
- 当他们循环到 aa +c + bb和bb + c + aa时长度一致且在同一个公共节点就能得到他们存在公共节点。
- 同样上述证明不成立也能证明他们没有公共节点。
ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode fastNode = headA,lowNode = headB;
// a和b互相切换直到两者跑到同一个节点
while(fastNode != lowNode){ // 只有当节点都指向尾结点空和存在相同节点时才会结束。
fastNode = fastNode != null ? fastNode.next : headB; //
lowNode = lowNode != null ? lowNode.next : headA;
}
return fastNode;
}
参考
- 来源:力扣(LeetCode)