分析:
- 首先,我们来分析一下题目,题目要求输入两个链表,那么我们要明白这两个链表可能是一样长,也有可能长短不一,如下图所示.
- 如果两个链表相交且长度不一样,那么一定是在相交前长度不一样,由此,我们可以先分别定义一个lenA和lenB,分别遍历两个链表,求得lenA和lenB
- len为lenA和lenB的差值,若lenA小于lenB,则用后者减去前者,然后遍历较长的链表,让其往后移len个长度
- 然后在两个链表不相等的前提下,让两个链表一人走一步,直到两个链表的某一结点地址相同了,就退出循环,返回其中的一个节点
- 若两个链表不相交,则返回的是空指针null,否则返回的是二者相交的那个节点
public static ListNode midNode(ListNode headA, ListNode headB) {
if(headA == null || headB == null) {
return null;
}
ListNode pL = headA;//永远指向最长的单链表
ListNode pS = headB;//永远指向最短的单链表
int lenA = 0;
int lenB = 0;
//求lenA,lenB的长度
while(pL != null) {
lenA++;
pL = pL.next;
}
while(pS != null) {
lenB++;
pS = pS.next;
}
pL = headA;
pS = headB;
//求两个链表的长度
int len = lenA - lenB;
if(len < 0) {
pL = headB;
pS = headA;
len = lenA - lenB;
}
//让较长的链表先走len步
while(len > 0) {
pL = pL.next;
len--;
}
//让pL和pL一人走一步
while(pL != pS) {
pS = pS.next;
pL = pL.next;
}
return pL;
}