两个链表的第一个公共结点

offer_36

概要:两个链表的第一个公共结点

题目描述

输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方 式显示的,保证传入数据是正确的)

链表形式类似于下面这样(这种是有交点的情况):

思路

让指向长的链表的指针领先走链表长度差值的步数,这样可以使两指针同时到达链表尾部,如果找到公共结点,返回即可。

用两个指针,分别指向两个链表头部,同时往后走,当其中一个走到链表尾时,则令其指向另一个链表头。另一个链表也是如此,走到链表尾时,也指向另一个链表头。此时已满足领先要走步数要求。

①P1、P2分别指向pHead1、pHead2链表头部;

②P1、P2向后走m步,此时P1指向pHead1尾部;

③使P1指向pHead2头部;

④P2指向pHead2尾部;

⑤使P2指向pHead1头部,此时P2在pHead2中已走了m-n步。P1、P2继续向后走,直至找到公共结点,后续两链表长度均为m。

思路图解:

思路动图:

动态图解

public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
        //长度相同有公共结点,第一次就遍历到;没有公共结点,走到尾部NULL相遇,返回NULL
        //长度不同有公共结点,第一遍走完长度的差值就出来了,第二遍一起到公共结点;没有公共,一起到结尾NULL。
        ListNode p1 = pHead1;
        ListNode p2 = pHead2;
        while (p1 != p2) {
            //如果当前结点为 null,就指向另一个链表的头结点开始第二次遍历
            p1 = (p1 == null) ? pHead2 : (p1 = p1.next);
            p2 = (p2 == null) ? pHead1 : (p2 = p2.next);
        }
        return p1;
    }

参考链接 https://blog.csdn.net/qq_38473097/article/details/106835500
https://blog.csdn.net/ananbei/article/details/80589360

原文地址:https://www.cnblogs.com/SunAlbert/p/13475761.html