剑指 Offer 52. 两个链表的第一个公共节点

剑指 Offer 52. 两个链表的第一个公共节点_第1张图片

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
class Solution {
    ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode A = headA,B = headB;
        while(A != B) {
            A = (A != null) ? A.next : headB;
            B = (B != null) ? B.next : headA;
        }
        return A;
    }
}

这里需要有一个发现,就是A和B的公共点点位置是有这样一个规律的,如果将A链表遍历结束后指向B链表,B链表遍历结束后指向A链表,假设存在C位置,C位置后为两个链表的公共链表,那么公共链表长度为c的话,前面的链表长度就分别为a - c 和 b - c。上面的链表指向可以实现 a - c + b = b - c + a 这个恒等式,这样C位置就能找到,如果C位置的值两个链表的value不一样,最终两个链表都会到达末尾的后一个节点null,也满足A = B,输出A也满足题意。

剑指 Offer 52. 两个链表的第一个公共节点_第2张图片

你可能感兴趣的:(剑指offer,链表,leetcode)