相交链表

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;
    }
}
posted @ 2025-04-21 03:04  Nickey103  阅读(9)  评论(0)    收藏  举报