每日打卡:相交链表

133 阅读2分钟

这是我参与2022首次更文挑战的第8天,活动详情查看:2022首次更文挑战

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。

图示两个链表在节点 c1 开始相交:

题目数据 保证 整个链式结构中不存在环。

原题链接

今天是一道简单题,他就很舒服,让我们找出相交的节点,这不是手到擒来,我这家传好几年的哈希是终于用上了啊

我们先将一个链表存入我们的哈希表,然后遍历另一个链表,我们只要找到我们的相同的就可以

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        Set<ListNode> visited = new HashSet<ListNode>();
        ListNode now = headA;
        while (now != null) {
            visited.add(now);
            now = now.next;
        }
        now = headB;
        while (now != null) {
            if (visited.contains(now)) {
                return now;
            }
            now = now.next;
        }
        return null;
    }
}
​

这一段代码应该都看的懂吧?我觉得不需要太多的解释

但是,这个样子我们就要结束了吗?那我们也太轻松了吧?算法题唉,我们需要的是思考,那这道题我们是不是可以用别的方法解出来呢?

67C0505C469335D7EB111FA5E517543B.jpg

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        //先对两个链表做非空判断
        if(headA==null||headB==null){
            return null;
        }
        ListNode a=headA,b=headB;
        //节点不相等我们继续循环,因为有交点会在交点处相等,没有交点会在最后为空的时候相等
        while(a!=b){
            //判断节点是否为空,如果为空,交换继续遍历,否则下一个节点
            a=a==null?headB:a.next;
            b=b==null?headA:b.next;
        }
        return a;
    }
}

是不是不同于我们之前的解法,在我的理解当中,我们的算法题虽然他有一定的类型,但是如果我们都一直使用那些套路来做题的话,我们是很难得到长进的,每一道题,他都有可能有他自己独特的一道解题思路,可能这种思路就只能适用于这一道题,他并不通用,我们需要很长的时间去想,但是,这并不是浪费时间,这才是我们开发思维的过程。