LeetCode-160-相交链表

这篇博客介绍了两种解决LeetCode-160问题的方法,即找出两个单链表的相交节点。第一种方法利用哈希表存储链表A的节点,然后遍历链表B检查是否存在于哈希表中。第二种方法采用双指针,分别从头开始遍历两个链表,当一个链表遍历完后,指针移到另一个链表继续,直到两个指针相遇于相交节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LeetCode-160-相交链表

在这里插入图片描述

思路

1.哈希表

A先遍历链表,使用哈希表存储A遍历过的节点,然后B遍历,同时查询哈希表中是否存在该节点。

2.双指针法

参考教你用浪漫的方式找到两个单链表相交的起始节点
一种比较巧妙的方式是,分别为链表A和链表B设置指针A和指针B,然后开始遍历链表,如果遍历完当前链表,则将指针指向另外一个链表的头部继续遍历,直至两个指针相遇。
最终两个指针分别走过的路径为:
指针A :a+c+b
指针B :b+c+a
明显 a+c+b = b+c+a,因而如果两个链表相交,则指针A和指针B必定在相交结点相遇。
在这里插入图片描述

代码

//1.哈希表
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        Set<ListNode> set = new HashSet<>();
        while (headA != null) {
            set.add(headA);
            headA = headA.next;
        }
        while (headB != null) {
            if (set.contains(headB)) return headB;
            headB = headB.next;
        }
        return null;
    }
}
//2.双指针
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if(headA==null||headB==null)return null;
       ListNode a=headA;
       ListNode b=headB;
       while(a!=b){
           a=a==null?headB:a.next;
           b=b==null?headA:b.next;
       }
       return a;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值