编写一个程序,找到两个单链表相交的起始节点。
分析:两个链表在某一结点相交,即为地址相同,可以分别遍历各链表,看在哪一个结点相交。考虑到两个链表的长度可能不一样,所以不能同步遍历,所以可以先求出链表长度的差值,让长链表先走差值个结点,然后再同步各自去遍历。
代码如下:
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA == null || headB == null) {
return null;
}
ListNode pL = headA;//始终让pL指向长的单链表
ListNode pS = headB;//指向短的
int lenA = 0;
int lenB = 0;
while(pL != null) {
pL = pL.next;
lenA++;
}
while(pS != null) {
pS = pS.next;
lenB++;
}
int len = lenA - lenB;
//因为后面还要从头开始遍历数组,所以求出长度后要让pL和pS指向头节点
pL = headA;
pS = headB;
//因为headA不一定是较长的链表,所以也要处理这种情况
if(len < 0) {
pL = headB;
pS = headA;
len = lenB - lenA;
}
for(int i = 0; i < len; i++) {
pL = pL.next;
}
while(pL != pS) {
pL = pL.next;
pS = pS.next;
}
return pL;
}