这是我参与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;
}
}
这一段代码应该都看的懂吧?我觉得不需要太多的解释
但是,这个样子我们就要结束了吗?那我们也太轻松了吧?算法题唉,我们需要的是思考,那这道题我们是不是可以用别的方法解出来呢?
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;
}
}
是不是不同于我们之前的解法,在我的理解当中,我们的算法题虽然他有一定的类型,但是如果我们都一直使用那些套路来做题的话,我们是很难得到长进的,每一道题,他都有可能有他自己独特的一道解题思路,可能这种思路就只能适用于这一道题,他并不通用,我们需要很长的时间去想,但是,这并不是浪费时间,这才是我们开发思维的过程。