相交链表

原题在这里:

概述:求两链表的相同节点,如果没有则为null

于是很日常的遍历code:

class Solution
{
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB)
    {
        if (!headA || !headB)
            return nullptr;
        ListNode *B = headB;
        while (B)
        {
            if (headA == B)
                return B;
            B = B->next;
        }
        return getIntersectionNode(headA->next, headB);
    }
};
normal

然后题解区发现有O(n+m)的解:

class Solution
{
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB)
    {
        if (!headA || !headB)
            return nullptr;
        ListNode *B = headB;
        while (B)
        {
            if (headA == B)
                return B;
            B = B->next;
        }
        return getIntersectionNode(headA->next, headB);
    }
};

注解都是这样的话:

1.走到尽头见不到你,于是走过你来时的路,等到相遇时才发现,你也走过我来时的路。

2.可以理解成两个人速度一致, 走过的路程一致。那么肯定会同一个时间点到达终点。如果到达终点的最后一段路两人都走的话,那么这段路上俩人肯定是肩并肩手牵手的。

3.你们之所以相遇,正是因为你走了 ta 走过的路,而 ta 也刚好走了你走过的路。这是何等的缘分!

4.如果选择了一起走下去,就要放弃一些东西,比如AC【恶搞】

 

好了好了,正常的注解:

pA走过的路径为A链+B链

pB走过的路径为B链+A链

pA和pB走过的长度都相同,都是A链和B链的长度之和,相当于将两条链从尾端对齐,如果相交,则会提前在相交点相遇,如果没有相交点,则会在最后相遇。

eg:

pA:1->2->3->4->5->6->null->9->5->6->null
pB:9->5->6->null->1->2->3->4->5->6->null

【Over】

posted @ 2022-03-23 12:26  Renhr  阅读(18)  评论(0)    收藏  举报