相交链表
160. 相交链表
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。
图示两个链表在节点 c1 开始相交:
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
解法1 双指针
没想出O(m + n)算法,直接看题解
核心思路:若相交,通过交替扫描,两指针一定在交点相遇;若不相交,两指针一定在null相遇(两指针均等于null)。
(被该算法等奇思妙想与评论区的诗意折服😂)
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA == null || headB == null) return null;
ListNode pA = headA; //pA扫描A链表
ListNode pB = headB; //pB扫描B链表
while (pA != pB) { //若pA与pB相遇, 1:均为空,表示两表不相交 2:不为空,表示两表相交且 位于交点
if (pA == null) { //pA扫到A表末尾时,从B表开始扫
pA = headB;
} else {
pA = pA.next;
}
if (pB == null) { //pB扫到B表末尾时,从A表开始扫
pB = headA;
} else {
pB = pB.next;
}
}
return pA;
}
}