一起养成写作习惯!这是我参与「掘金日新计划 · 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中进行节点数据的查找即可。这是一种典型的空间换时间的解题思路。
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。