简述Java实现无环单链表判交 ?
参考答案:
在Java中,要判断两个无环单链表是否相交,可以通过以下步骤实现:
- 获取两个链表的长度,分别为len1和len2。
- 如果len1 > len2,交换链表A和链表B,以及len1和len2,确保len1 <= len2。
- 让较长的链表B先走|len2 - len1|步,这样两个链表就可能在某个节点相遇。
- 同时遍历两个链表,每次各走一步,直到相遇或者遍历完。
- 如果两个链表在某个节点相遇,那么它们就是相交的;否则,它们不相交。
以下是这个算法的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;
}
}
注意,这个算法假设了每个节点只有一个指针指向下一个节点,即链表没有环。如果链表可能有环,那么需要先判断链表是否有环,如果有环,则不能直接使用上述算法。