双指针法

复杂度

时间 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个链表中长度最短的那个,然后用同样的方法将其他链表和这个链表两两比较,因为每个都有可能有一个不同的交点,所以我们要维护一个全局最优的交点,更新这个全局最优交点的条件,是这个交点到终点的步数是最少的。但是统计交点到终点的步数比较困难,我们可以直接统计从最短链表开头到交点的步数,其实是等价的。


ethannnli
858 声望360 粉丝