编写一个程序,找到两个单链表相交的起始节点。
如下面的两个链表:
思路:
分别计算A和B两个链表的长度len1和len2,让长的那个链表先走(len1-len2)步,此时两个链表是处于同步的状态,接下来让两个链表同时走,当找到的第一个节点则为该链表的交点
注意:两个链表的循环判断条件不是他们两节点的val值,而是他们所指的对象。例如:while(A!=null&&B!=null) if(A==B)
代码如下:
1.遍历两个链表,取得len1和len2
//思路:1.先遍历两个链表,取得len1和len2
//2.让较长的链表先向后移动len1-len2个长度
//3.两个链表同时走,直到相交的时候
public int getlenth(ListNode head){
int len = 0;
for(ListNode cur = head;cur != null;cur = cur.next){
len++;
}
return len;
}
int len1 = getlenth(headA);
int len2 = getlenth(headB);
2.让较长的链表先向后移动(len1-len2)个长度
让较长的链表先移动指定长度是为了得到两个长度相同的链表从而可以更方便的对两个链表的比较
if(len1>len2){
for(int i =0;i<(len1-len2);i++){
headA = headA.next;
}
}else{
for(int i =0;i<(len2-len1);i++){
headB = headB.next;
}
}
3.两个链表同时走,直到相交的时候
while(headA != null && headB!=null){
//循环条件不是判断节点的值而是节点对象的身份
//所以要一直循环下去,直到找到两个链表的交点
//如果到最后链表为空的时候跳出循环,则说明两个链表不相交
if(headA == headB){
return headA;
}
headA = headA.next;
headB = headB.next;
}
return null;
循环条件不是判断节点的值而是节点对象的身份,所以要一直循环下去,直到找到两个链表的交点。如果到最后链表为空的时候跳出循环,则说明两个链表不相交。