给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
https://leetcode-cn.com/problems/intersection-of-two-linked-lists/
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
链接:
目录
解题思路
hashSet去重:
因为不存在环结构,所以还是可以利用HashSet的不能储存重复元素的特性来解题。这个和链表检查是否有环那个题目类似。
代码
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
HashSet<ListNode> nodeSet = new HashSet<>();
while (headA != null) {
nodeSet.add(headA);
headA = headA.next;
}
while (headB != null) {
if (!nodeSet.add(headB)) {
return headB;
}
headB = headB.next;
}
return null;
}
a+b = b+a:
这个上一张图,就是从a 和 b 头结点开始遍历,a走完自己的链表走b走过的链表,b走完自己链表走a走过的链表。如果两个链表相交,那么他们就会在相交的地方相遇。代码是copy答案的,自己写的比较烂。
代码
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;
}