思路一:使用哈希表来保存其中一个链表A的所有节点,然后对链表B进行遍历查找,存在相同节点则相交。
缺点:需要额外的空间,空间复杂度为O(n)
import java.util.*;
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
//定义两个新的链表指向原链表,题目要求原链表不改变
ListNode linkA=headA;
ListNode linkB=headB;
Set<ListNode> set=new HashSet();
while(linkA!=null)
{
set.add(linkA);
linkA=linkA.next;
}
while(linkB!=null)
{
if(set.contains(linkB))
{
return linkB;
}
linkB=linkB.next;
}
return null;
}
}
思路二:A走完A的路,再走B的路,B走完B的路再走A的路,如果相交,则AB必定相遇,如果不相交,则AB在终点“null”相遇(原理是两个人各自走过的总路程相等一定相等。)
复杂度:空间O(1),时间2O(n+m) nm分别为链表AB的长度,即大O(n)
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode linkA=headA;
ListNode linkB=headB;
//这个判断可以去掉,下面已经考虑进去了
if(linkA==null||linkB==null)
{
return null;
}
//循环结束条件AB到达相交节点或者AB都为null
while(linkA!=linkB)
{
if(linkA!=null)
{
linkA=linkA.next;
}
else
{
linkA=headB;
}
if(linkB!=null)
{
linkB=linkB.next;
}
else
{
linkB=headA;
}
}
return linkA;
}
}