问题:给定两个可能或不相交的链表的头节点,找出它们是否相交并返回相交点;否则返回null。
求解时间:o(m + n),空间o(1):
代码如下:
public static LinkedListNode intersect(
LinkedListNode head1,
LinkedListNode head2) {
LinkedListNode list1node = null;
int list1length = get_length(head1);
LinkedListNode list2node = null;
int list2length = get_length(head2);
int length_difference = 0;
if(list1length >= list2length) {
length_difference = list1length - list2length;
list1node = head1;
list2node = head2;
} else {
length_difference = list2length - list1length;
list1node = head2;
list2node = head1;
}
while(length_difference > 0) {
list1node = list1node.next;
length_difference--;
}
while(list1node != null) {
if(list1node == list2node) {
return list1node;
}
list1node = list1node.next;
list2node = list2node.next;
}
return null;
}
但是,我在想交叉点是否可能出现在较长列表中d步骤之前的位置?喜欢:
我很困惑,请帮助我清除思路,谢谢!
答案 0 :(得分:2)
一个节点只能有一个后继。在第二张图片中,相交节点有两个后继节点,这是不可能的。
答案 1 :(得分:0)
不。这是不可能的。因为在交点之后,两个列表的其余部分应该相同,这意味着它们应该具有
因此d
步骤之前是不可能的,因为那将不满足第1点的要求。
答案 2 :(得分:0)
您的算法正确。但是,在交点之后,它不再是两个列表,而是一个列表。
因此,d
的任何区别都没有。的节点,它在交点之前。
答案 3 :(得分:0)
首先,您不能使用给定的输入创建单链列表。 一个节点只能指向单个下一个节点。在您的输入中,节点指向两个下一个节点。您需要找到两个列表融合的交点。您的算法会在“ d”个节点之后立即找到相交点,这是预期的输出结果