双指针法
复杂度
时间 O(N) 空间 O(1)
思路
先算出两个链表各自的长度,然后从较长的链表先遍历,遍历到较长链表剩余长度和较短链表一样时,用两个指针同时遍历两个链表。这样如果链表有交点的话,两个指针已经一定会相遇。
代码
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode nodea = headA, nodeb = headB;
int lena = 0, lenb = 0;
// 计算链表A的长度
while(nodea != null){
lena++;
nodea = nodea.next;
}
// 计算链表B的长度
while(nodeb != null){
lenb++;
nodeb = nodeb.next;
}
// 让较长的链表先飞一会
for(int i = 0; i < Math.abs(lena - lenb); i++){
if(lenb > lena) headB = headB.next;
else if(lena > lenb) headA = headA.next;
}
while(headA != null && headB != null){
if(headA == headB) return headA;
headA = headA.next;
headB = headB.next;
}
return null;
}
}
后续 Follow Up
Q:如果是K个链表的交点如何求?
A:先找出K个链表中长度最短的那个,然后用同样的方法将其他链表和这个链表两两比较,因为每个都有可能有一个不同的交点,所以我们要维护一个全局最优的交点,更新这个全局最优交点的条件,是这个交点到终点的步数是最少的。但是统计交点到终点的步数比较困难,我们可以直接统计从最短链表开头到交点的步数,其实是等价的。