问题描述
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点(这里的交点更像是汇集点,从此结点开始两链表合为一链表)。如果两个链表不存在相交节点,返回 null 。 原题链接
思路与方法
第一眼看到这题很快应该能想到用哈希,即用哈希表存储其中一个链表的所有节点,然后再顺序遍历另一链表,若在哈希表中能够查找到遍历的节点则说明该节点便是交点,反之没有交点。但此题进阶是需要O(1)的空间复杂度,刚开始想的时候若用两指针分别遍历两链表,若两表长度相等则可同时遍历并判断,若是不同则短的会先遍历完。可使短链表指针走完后再走长链表的,长链表走完后再走短链表的,则可使两指针走的总长度相等,即意味着若两链表有交点则两指针会同时到达交汇点。
Code
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode n1=headA,n2=headB;
while(n1!=null||n2!=null){
if(n1==n2)return n1;//到达交汇点
if(n1!=null)n1=n1.next;
else n1=headB;//A表走完后再走B表
if(n2!=null)n2=n2.next;
else n2=headA;//B表走完后再走A表
}
return null;//没有交汇点
}
复杂度分析
遍历了两链表,若两链表长度分别为m和n,则时间复杂度为O(m+n),内存上仅用了两指针节点,为常数量,所以空间复杂度为O(1)
拓展
该思路也可以扩展至3链表、4链表,若n条链表交汇于一节点,也可用n个指针遍历,每当一指针遍历完一表则按序遍历下一表,直到所有指针都指向同一节点(交汇点)