给定两个链表,找出两个链表相交的起始交点

给定两个链表,找出两个链表相交的起始交点

思路:首先求出两个链表的长度,再求出它们的长度差,然后让较长的链表走差值步,然后再让它们一起走,如果它们相遇且不为null,代表此时就是它们的起始交点。

public static Nodee Findpublic(Nodee headA,Nodee headB) {//这是针对两个单链表,所以把方法写在这里比较合适,链表类针对的是一个单链表
        Nodee ps = headA;//定义一个ps来指向短的单链表
        Nodee pl = headB;//定义一个pl指向长的单链表
        int lenA = 0;
        int lenB = 0;
        while(ps!=null) {//先求链表A的长度
            ps = ps.next;
            lenA++;
        }
        while(pl!=null) {//再求链表B的长度
            pl = pl.next;
            lenB++;
        }
        pl = headB;//因为上面的循环执行完之后ps和pl都已经为null了,所以要重新定义回来
        ps = headA;
        int len = lenB - lenA;//计算这两个链表的长度差
        if(len<0) {//说明链表B比链表A要短
            ps = headB;//让ps重新指向B
            pl = headA;//让p重新指向A
            len = lenA-lenB;//重新计算差值
        }
        //此时pl一定指向的是最长的单链表。
        for(int i = 0;i<len;i++) {//让pl先从头开始走差值步,走到与短链表的头一样的位置
            pl = pl.next;
        }
        //这个循环退出的时候ps和pl在两个链表的相同长度处
        while(pl!=ps) {//当pl=ps的时候退出循环,此时pl和ps要么相遇了,要么都为null了。
            pl = pl.next;
            ps = ps.next;
        }
        if(pl==null||ps==null) {//如果是因为它们两个都为null退出的循环,说明走到头了,且没有交叉点
            return null;
        }
        return pl;//说明不是因为上面的情况,此时返回pl或者ps所在的节点就是公共节点,
    }

总结:定义一个pl来指向A链表的头节点,再定义一个ps来指向B链表的头节点,首先算出链表A的长度lenA,再算出链表B的长度lenB,求出它们的差值,如果它们的差值小于0.代表B链表比A链表长,让pl指向链表B的头节点,ps指向链表A的头节点,重新算处len = lenA-lenB。这个时候不管哪个情况pl指向的一定是最长的那条单链表的头节点,然后让pl走len步。此时ps和pl在两个链表的相同长度处,再让ps和pl同时走,当ps = ps的时候退出循环,如果是因为pl= =null或者ps= =null退出的循环,说明它们没有相交,返回null。否则就一定是因为它们相交退出的循环,返回pl和ps都可

注:相交一定是Y型相交而不是X型相交,因为它们相交之后说明下一个节点的引用都一样,都指向的是同一个节点。

上一篇:运算结果


下一篇:备份需求库规划库数据到temp模式里