【Java数据结构】如果两个单链表相交,输出相交节点

思路:寻找同一起跑线,再找节点

     【Java数据结构】如果两个单链表相交,输出相交节点_第1张图片

让 两个链表先处于同一起跑线,如图所示,然后再  同时向后遍历(从d和h开始同时向后遍历),那么就可以确定是在哪个地方相交的了(确定了在f处相同,即交点)。

那么如何让他俩处于同一起跑线呢?

很简单,只需要长的链表先走    走到与短的链表一样长就可以了。

所以解法:1,分别计算两个链表的长度,得出差值(长的为7,短的为4,差值3)

                  2,让长的链表先走   差值  步,此时两个链表长度相同(长的从d开始,短的从h开始)

                  3,同时遍历两个链表,当相同时,即找到了交点。(遍历到f时相等,即交点)

 

代码:

 public Entry findMeetEntry(NhLinkedList two){
        //说明:   size()方法是  计算链表长度的方法
        //        first  是头结点
        //第一步:计算长度  得出差值step,把长的链表赋给p  短的赋给q
        int size1 = size();
        int size2 = two.size();
        Entry p = size1 > size2 ? first : two.first;
        Entry q = size1 < size2 ? first : two.first;
        int step = Math.abs(size1-size2);
        
        //第二步:长的走差值步,让两个链表处于同一起跑线。
        for ( ; step != 0;p = p.next){
            step--;
        }
        
        //第三步:同时遍历两个链表,相同时返回
        while (p != null){
            if (q == p)
                return p;
            q = q.next;
            p = p.next;
        }
        return null;
    }

 

你可能感兴趣的:(数据结构)