题目地址:https://leetcode.cn/problems/intersection-of-two-linked-lists/
思路一:辅助空间法。引入一个HashMap,遍历其中一个链表的所有节点,并将节点本身作为key存入HashMap。再遍历另一个链表的所有节点,如果节点已经在HashMap中存在,说明有相交,返回该节点;否则返回null。代码如下:
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
//构建用于存放headA所有节点的Hash表
HashMap<ListNode, Integer> aNodes = new HashMap<ListNode, Integer>();
while(headA != null) {
aNodes.put(headA, 1);
headA = headA.next;
}
//遍历headB找到headA中的节点就返回
while(headB != null) {
if(null != aNodes.get(headB)) {
return headB;
}else{
headB = headB.next;
}
}
return null;
}
}
时间复杂度:O(m+n)
空间复杂度:O(m+n)
思路二:双指针法。这里主要考虑的问题是A和B链表长度是不一样的,在遍历的时候,如果A到头了,就重新从headB开始;如果B到头了,就重新从headA开始,直到两个节点相等,此时如果是Null就说明不想交,否则说明相交。代码如下:
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode p1 = headA;
ListNode p2 = headB;
while(p1 != p2) {
p1 = p1 == null ? headB : p1.next;
p2 = p2 == null ? headA : p2.next;
}
return p1;
}
}
时间复杂度:O(m+n)
空间复杂度:O(1)
本文介绍了LeetCode第160题的解题思路,包括使用辅助空间的HashMap法和双指针法。两种方法的时间复杂度均为O(m+n),但空间复杂度不同,HashMap法为O(m+n),双指针法为O(1)。通过遍历链表并判断节点是否存在来找出相交部分。

被折叠的 条评论
为什么被折叠?



