【LeetCode-简单题】160. 相交链表

文章介绍了两种找到两个链表相交节点的方法:一是利用Java中的HashSet进行去重,遍历较短链表并添加到集合中,然后遍历较长链表,如果在集合中不存在则说明不是相交节点;二是使用双指针同步移动,当两个指针相遇时即为相交节点。这两种方法均能有效解决链表相交问题。
摘要由CSDN通过智能技术生成

题目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

题解一:set 哈希集合

  • 采用set集合的去重特性,先遍历A表,再遍历B表的同时判断是否有相同的链表节点(两条链表里面虽然有元素相同,但是不是同一对象,但是相交的链表节点肯定是同一个对象,相同对象在add的时候会返回false

在这里插入图片描述

/**
     * set集合去重方法
     * @param headA
     * @param headB
     * @return
     */
    public static ListNode getIntersectionNode(ListNode headA, ListNode headB) {

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

        Set<ListNode> listNodeSet = new HashSet<>();
        //遍历A表
        while(headA != null){
            listNodeSet.add(headA);
            headA = headA.next;
        }
        //遍历B表  并且同时判断是否存在重复元素
        while (headB != null){
            boolean addBoolean = listNodeSet.add(headB);
            if (!addBoolean) {
                return headB;
            }
            headB = headB.next;
        }
        //B表能循环到null,代表两个链表没有相交
        return null;
    }

题解二:双指针解法

这是一个不容易想出来的方法:因为两个链表有长有短,那么只要两个链表在走完自己的链表之后,再去另一个链表的头走起,一直走下去,若两个链表指针相遇了,相遇的这个节点就是两个链表相交的共同值。

定义两个指针, 第一轮让两个到达末尾的节点指向另一个链表的头部, 最后如果相遇则为交点(在第一轮移动中恰好抹除了长度差)
两个指针等于移动了相同的距离, 有交点就返回, 无交点就是各走了两条指针的长度

在这里插入图片描述

  /**
     * 双指针法
     *
     * @param headA
     * @param headB
     * @return
     */
    public static ListNode getIntersectionNode(ListNode headA, ListNode headB) {

        if (headA == null || headB == null) {
            return null;
        }
        //设置A 和 B  的开始链表指针  Pa 和  Pb
        ListNode Pa = headA;
        ListNode Pb = headB;
        //遍历同样的步数
        while (Pa!= Pb){//不论是走到的相等或者最后为null都结束循环
            //若pa遍历完了A链表则去遍历B 链表
            if (Pa == null) {
                Pa = headB;
            }else {
                //遍历
                Pa = Pa.next;
            }
            //若pb遍历完了B链表则去遍历A   链表
            if (Pb == null) {
                Pb = headA;
            }else {
                //遍历
                Pb = Pb.next;
            }
        }
        return Pa;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值