📅  最后修改于: 2023-12-03 15:27:11.461000             🧑  作者: Mango
在开发中,经常会出现两个链表有交点的情况,本文将介绍如何使用Java编写程序来查找两个链表的交点。
要查找两个链表的交点,有以下两种解决方式。
第一种方式是遍历。
假设两个链表的长度分别为m和n,先让较长的链表先走n-m步,然后两个链表同时开始遍历,找到第一个相同的节点即为它们的交点。
具体实现:
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
int lengthA = getLength(headA);
int lengthB = getLength(headB);
int diff = lengthA - lengthB;
if (diff < 0) {
return getIntersectionNode(headB, headA);
}
for (int i = 0; i < diff; i++) {
headA = headA.next;
}
while (headA != null && headB != null && headA != headB) {
headA = headA.next;
headB = headB.next;
}
return headA;
}
private int getLength(ListNode head) {
int length = 0;
ListNode cur = head;
while (cur != null) {
length++;
cur = cur.next;
}
return length;
}
第二种方式是使用哈希表。
先遍历其中一个链表,将每个节点通过哈希表记录下来。
再遍历另一个链表,查找哈希表中是否有相同的节点。
具体实现:
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
Set<ListNode> set = new HashSet<>();
ListNode node = headA;
while (node != null) {
set.add(node);
node = node.next;
}
node = headB;
while (node != null) {
if (set.contains(node)) {
return node;
}
node = node.next;
}
return null;
}
以上就是查找两个链表的交点的两种解决方式,具体使用哪种方式,应根据实际情况来选择。
使用遍历方式的时间复杂度为O(m+n),使用哈希表的时间复杂度为O(m+n),但空间复杂度为O(m)或O(n),比使用遍历方式更耗费空间。
在实际使用中应根据实际情况来选择合适的方式。