跳到主要内容

简述Java实现无环单链表判交 ?

参考答案:

在Java中,要判断两个无环单链表是否相交,可以通过以下步骤实现:

  1. 获取两个链表的长度,分别为len1和len2。
  2. 如果len1 > len2,交换链表A和链表B,以及len1和len2,确保len1 <= len2。
  3. 让较长的链表B先走|len2 - len1|步,这样两个链表就可能在某个节点相遇。
  4. 同时遍历两个链表,每次各走一步,直到相遇或者遍历完。
  5. 如果两个链表在某个节点相遇,那么它们就是相交的;否则,它们不相交。

以下是这个算法的Java实现:

public class ListNode {
    int val;
    ListNode next;
    ListNode(int x) {
        val = x;
        next = null;
    }
}

public class Solution {
    public boolean isIntersect(ListNode headA, ListNode headB) {
        if (headA == null || headB == null) {
            return false;
        }
        
        ListNode pA = headA;
        ListNode pB = headB;
        
        // 获取两个链表的长度
        int lenA = 0, lenB = 0;
        while (pA != null) {
            lenA++;
            pA = pA.next;
        }
        while (pB != null) {
            lenB++;
            pB = pB.next;
        }
        
        // 交换链表和长度,确保lenA <= lenB
        if (lenA > lenB) {
            ListNode temp = headA;
            headA = headB;
            headB = temp;
            int tempLen = lenA;
            lenA = lenB;
            lenB = tempLen;
        }
        
        // 让较长的链表先走|lenB - lenA|步
        for (int i = 0; i < lenB - lenA; i++) {
            headB = headB.next;
        }
        
        // 同时遍历两个链表,直到相遇或者遍历完
        while (headA != null && headB != null) {
            if (headA == headB) {
                return true;
            }
            headA = headA.next;
            headB = headB.next;
        }
        
        return false;
    }
}

注意,这个算法假设了每个节点只有一个指针指向下一个节点,即链表没有环。如果链表可能有环,那么需要先判断链表是否有环,如果有环,则不能直接使用上述算法。