判断两条链表是否相交,若相交求出相交的节点,首先拿到这道题,需要先思考一个问题,链表相交是怎样的相交?
链表相交实际上是两条链表汇成一条链表,不可能出现和直线一样的相交,因为链表中节点的指针只能指向一个对象,所以相交的结果是两条链表在某一个节点汇成一条链表。清楚了这个问题,接下来就该思考如何求得这个相交的节点,可以想一下如果是两条长度一样的链到这个相交点的距离肯定是一样长的,顺着这个思路,就可以想到,如果我们求出这两条链的长度差,然后利用上面的原理就可以找到这个节点,有了这个思路,接下来就该思考如何来实现这个过程,首先求长度差,不可预知的是哪条链长,所以可以判断一下,两种情况的长度差都表示出来,得到长度差之后就可以让长的那条链不断的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;
}
}