LeetCode-160. 相交链表

题目地址

https://leetcode.cn/problems/intersection-of-two-linked-lists/

题解

题解一(Java)

作者:@仲景
如果使用额外的内存空间来标识某一个链表的话,其实可以打表来实现
先将某一个链表的节点全部存到hash表中,然后遍历另一个链表,每次判断节点是否存在于hash表中,第一个存在的节点就是交点,不存在就会遍历完链表

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {

        // 如果链表有一个为空或者都为空,都不会存在交点
        if (headA == null || headB == null)
            return null;

        // 创建hash表
        Set<ListNode> set = new HashSet<>();

        // 遍历链表A
        ListNode node = headA;
        // 把链表A所有节点都放到hash表中
        while (node != null) {
            set.add(node);
            node = node.next;
        }

        // 遍历链表B
        node = headB;
        while (node != null) {
            // 第一个存在于hash表的节点就是两个链表的交点
            if (set.contains(node)) {
                return node;
            }
            node = node.next;
        }

        // 不存在交点
        return null;
    }
}

题解二(Java)

作者:@仲景

假设链表A到交点的距离是lenA,链表B到交点的距离是lenB,交点之后的长度是lenC
如果两个链表存在交点的话,那么走完链表A+lenB和走完链表B+lenA的时候,会走到链表A和B的第一个交点上
求证:
为什么长度一致?
题解一的思路是通过判断两个链表长度来使得长链表和短链表到交点的距离一致,那么其实换位思考来讲,链表A多走lenB次,链表B多走lenA次,lenC是一个固定值,那这样两个链表的行进长度也是一致的
为什么相交的是第一个节点?
如果假设这个交点存在的话,从链表A开始走,交点一定是在lenA+lenC+lenB的长度上,链表B同理。如果不懂可以画图看看

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {

        if (headA == null || headB == null) {
            return null;
        }

        ListNode nodeA = headA;
        ListNode nodeB = headB;

        while (nodeA != nodeB) {

            nodeA = nodeA == null ? headB : nodeA.next;

            nodeB = nodeB == null ? headA : nodeB.next;

        }

        return nodeA;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值