4月更文d6n6-leetcode刷题160相交链表

128 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情

leetcode刷题160相交链表

前文

本文为leetcode链表处理类型题目,题目序号为160,题目链接为https://leetcode-cn.com/problems/intersection-of-two-linked-lists/,主要考察对于链表相关知识的应用。

题目信息

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

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

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

注意,函数返回结果后,链表必须 保持其原始结构 。

解题思路

根据题目的信息,简单来说是有两个链表,而我们的目标是想要寻找到两个链表的相交节点。很显然本题目难以绕开对于链表的展开。本文的解法主要是通过额外的数据结构map,通过对于第一个链表中的所有节点遍历,将每个链表节点存入map对象中。通过一轮遍历后,即可将所有的节点均存储在map结构中。此时对于另一链表进行遍历,对于每一个节点都去其中查找。如果找到,那么则认为是两个链表的相交节点。如果链表遍历完成后,也没找到对应的节点,则直接返回空。需要注意的是,我们需要存储的是链表的节点,而不单纯是链表节点上的数值。

解题代码

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
    HashMap<ListNode,Integer> map = new HashMap<>();
    ListNode node = headA;
    while (node != null){
        map.put(node,1);
        node = node.next;
    }
    ListNode node2 = headB;
    while (node2 != null){
        if(map.containsKey(node2)){
            return node2;
        }
        node2 = node2.next;
    }
    return null;
}

结合代码来看一下这个题目的解答,首先对于给定的链表a进行一次遍历操作,所有的节点则被存入到map结构之中。而后续在对于链表b的遍历中,只需要到map中进行节点数据的查找即可。这是一种典型的空间换时间的解题思路。

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。