面试题五十二:两个链表的第一个交点

 

方法一:暴力,遍历A链表每一个节点的过程中,对B链表进行检查 O(AB)
方法二:因为题目中链表是单向的,所以在第一个重合点后,其他都相等,就是Y型的。所以他们尾节点是相同的,因此就重后面开始,符合“先进后出的特点”,我们可以定义两个栈,然后链表进栈,在进行出栈比较;
方法三:先获取两个链表的长度,如果长的长度比短的长m,则长先走m步后再一起走,开始比较

 ListNode findfrist( ListNode A,ListNode B){
            //获取链表长度
            int Alength=1,Blength=1;
             ListNode A1=A;
             while(A1.next!=null){
                    A1=A1.next;
                    Alength++;
             }
             ListNode B1=B;
             while(B1.next!=null){
                    B1=B1.next;
                    Blength++;
             }
            //长的先走k步
             int k=B.length-A.length;
             while(k<0){
                k++;
                A=A.next;
             }
             while(K>0){
                k--;
                B=B.next;
             }
            //同等长度·下开始比较直到找到交点直接返回
            while(Alength>0 ){
                    if(A==B)return A;
                    A=A.next;
                    B=B.next;
                    A.length--;
            }

            //没有交点到最后就是null
            return null;
    }

注意:如果将尾节点看成根节点,那么就像是两棵树寻找共同祖先

posted @ 2020-03-29 16:47  浪波激泥  阅读(217)  评论(0编辑  收藏  举报