判断两条链表是否相交

判断两条链表是否相交,若相交求出相交的节点,首先拿到这道题,需要先思考一个问题,链表相交是怎样的相交?
链表相交实际上是两条链表汇成一条链表,不可能出现和直线一样的相交,因为链表中节点的指针只能指向一个对象,所以相交的结果是两条链表在某一个节点汇成一条链表。清楚了这个问题,接下来就该思考如何求得这个相交的节点,可以想一下如果是两条长度一样的链到这个相交点的距离肯定是一样长的,顺着这个思路,就可以想到,如果我们求出这两条链的长度差,然后利用上面的原理就可以找到这个节点,有了这个思路,接下来就该思考如何来实现这个过程,首先求长度差,不可预知的是哪条链长,所以可以判断一下,两种情况的长度差都表示出来,得到长度差之后就可以让长的那条链不断的next直到两条链到相交点的长度相等,即就是先让长的那条链进行长度差个next,然后这两条到相交点的距离就相等了,接着让两条链同时往后走,不断判断两条链的值是否相等,如果相等,那么这个节点就是两条链的相交点,返回这个节点的引用,如果走到最后两条链都不想等,就是链条链不相交,返回null.
下面这段代码就是这道题的具体解题方法:

public class Test0728 {
    private  int getLength(ListNode head)
    {
        int  len=0;
        for(ListNode c=haed;c!=null;c=c.next)
        {
            len++;
        }
        return len;
    }
    public  ListNode   getIntersectionNode(ListNode   headA,ListNode  headB)
    { 
        int   lenA=getLength(headA);
        int   lenB=getLength(headB);
        ListNode longer=headA;
        ListNode shorter=headB;
        int diff=lenA-lenB;
        if(lenA<lenB)
        {
            longer=headB;
            shorter=headA;
            diff=lenB-lenA;
        }
        for(int i=0;i<diff;i++)
        {
            longer=longer.next;
        }
        while(longer!=shorter)
        {
            longer=longer.next;
            shorter=shorter.next;
        }
        return longer;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值