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

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

思路

两个链表结构像是一个“Y”,这个第一个公共结点就是这个Y的中间那个点(不是找相同的那个结点)。
设置两个指针,让他们分别跟踪一个链表,如果长度相同,第一趟就能找到(这个很容易想到,对一下这个“Y)
若长度不一样,当跟踪指针走到某条链表最后,继续走另一条链表,相当于两个跟踪指针走的是长度一样的链表,只不过顺序不同。
要 更容易去理解的话,可以用假设法,可验证出这个思路是对的。设链1长度 a+n ,链2长度 b+n ,n就是这个“Y”的那一竖,a和b分别是”Y“上面的两条线,长度可相同可不相同,脑海中模拟走一遍就得了。

代码

public class Solution {
    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
        ListNode p1=pHead1,p2=pHead2;
        int k1=0, k2=0;//用来记录两个跟踪指针第几次切换链表,第二次切换说明没有公共结点
        while(p1 != p2 && k1 !=2 && k2 !=2){
            if(p1 != null)p1 = p1.next;
            else{
                p1 = pHead2;
                k1 ++;
            }
            if(p2 != null)p2 = p2.next;
            else{
                p2 = pHead1;
                k2 ++;
            }
        }
        return p1;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值