力扣-hot100-t160-相交链表

两个链表判断是否相交

例如:

A:1,2,3,4,5

B:6,3,4,5

相交。

思路一:链表不能判断长度,而且两层for循环时间复杂度很高,所以用哈希表存放一个链表的结点,再遍历另一个链表,判断哈希表中是否有值,如果有值说明在这个值的位置相交。

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        HashSet<ListNode> listNodes = new HashSet<>();
        while (headA != null){
            listNodes.add(headA);
            headA = headA.next;
        }

        while (headB != null){
            if (listNodes.contains(headB)){
                return headB;
            }
            headB = headB.next;
        }
        return null;
    }

思路二:之所以不用for同步遍历链表,是因为链表的长度不能确定,不能判断从哪里开始相交,所以可以通过右对齐,缺的位置补上。(最好不要用NULL补空,会混淆链表结束判断)。

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if (headA == null || headB == null) {
            return null;
        }
        ListNode pA = headA, pB = headB;
        while (pA != pB) {
            pA = pA == null ? headB : pA.next;
            pB = pB == null ? headA : pB.next;
        }
        return pA;
    }

pA == null,链表A结束,拼接B,否则继续遍历(通过A+B对齐,比较常见的一种对齐方法)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值