【牛客网-名企高频面试题】 NC66 两个链表的第一个公共结点

【牛客网-名企高频面试题】 NC66 两个链表的第一个公共结点

题目描述

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

方法:双指针法
在这里插入图片描述

  • 如何让本来长度不相等的变为相等的?

可以让a+b作为链表A的新长度,b+a作为链表B的新长度。

在这里插入图片描述

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
    //分析:如果2个相加的链表,表头不相等  则肯定有共同尾部
         if(pHead1 == null || pHead2 == null)
             return null;
        ListNode p1 = pHead1;
        ListNode p2 = pHead2;
        while(p1 != p2){
            p1 = p1.next;
            p2 = p2.next;
            // 寻找公共节点
        	if (p1 != p2) {
            // 判断谁先走到了头 先走到头的回来继续走
            // 相当于减去长链表比短链表长的部分 然后2个相同长度的链表从头开始遍历
                if(p1 == null) p1 = pHead2;
                if(p2 == null) p2 = pHead1;
            }
        }
        return p1;
    }
}

代码的ifelse语句,对于某个指针p1来说,其实就是让它跑了连接好的的链表,长度就变成一样了。
如果有公共结点,那么指针一起走到末尾的部分,也就一定会重叠。看看下面指针的路径吧。
p1: 0-1-2-3-4-5-null(此时遇到ifelse)-a-b-4-5-null
p2: a-b-4-5-null(此时遇到ifelse)0-1-2-3-4-5-null
因此,两个指针所要遍历的链表就长度一样了!
如果两个链表存在公共结点,那么p1就是该结点,如果不存在那么p1将会是null。

posted @ 2021-01-12 22:14  your_棒棒糖  阅读(36)  评论(0)    收藏  举报