题目描述
输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
1、思路分析
一开始是想两层循环来遍历两个链表,过于复杂,实则是没有真正理解题目的含义,第一个公共结点意味着当前结点的val值以及下一个结点的地址值是相同的,而同一个地址值意味着存储的内容一致,以此往下推,说明从第一个公共结点之后,两链表的所有结点都是一样的。因此思路也就出来了:先求出两链表的长度,让长的链表先走两者长度之差,最后再逐一比较比较剩下的结点。
2、代码

public class Solution {
    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
        if(pHead1 == null || pHead2 == null) return null;
        // 求两链表的长度
        int count1 = 0;
        ListNode p1 = pHead1;
        while(p1 != null) {
            p1 = p1.next;
            count1++;
        }
        int count2 = 0;
        ListNode p2 = pHead2;
        while(p2 != null) {
            p2 = p2.next;
            count2++;
        }
        // 将长链表的指针移动到和短链表相同长度的位置
        int flag = count1-count2;
        if(flag > 0) {
            while(flag > 0) {
                pHead1 = pHead1.next;
                flag--;
            }
            while(pHead1 != pHead2) {
                pHead1 = pHead1.next;
                pHead2 = pHead2.next;
            }
            return pHead1;
        }
        else {
            flag = -flag;
            while(flag > 0) {
                pHead2 = pHead2.next;
                flag--;
            }
            while(pHead1 != pHead2) {
                pHead1 = pHead1.next;
                pHead2 = pHead2.next;
            }
            return pHead2;
        }
    }
}