MergePoint (LinkList list1, LinkList list2){
p = list1.head;
q = list2.head;
while (p.next!=null && q.next!=null){
if (p.next == q.next){
System.out.print(p.value + " is the Merging node");
return;
}
p=p.next;
q=q.next;
}
}
我正在尝试解决问题,找出2个链接列表的合并节点。 在查看其他解决方案之前,我决定编写代码,然后与其他现有解决方案进行比较。 我在这里采用的方法是找到列表指针指向的公共节点。 你同意这个代码还是有什么东西在这里缺失?
答案 0 :(得分:2)
我想到了三种解决方案。
首先,嵌套循环Irfy发布。它使用常量内存但是O(N * M)时间,其中N和M是两个列表的长度。
其次,您可以通过将一个列表的每个节点首先放入HashSet,然后遍历另一个列表并对HashSet进行查找来交换空间。因为该查找是O(1),所以总时间是O(N + M)(构建哈希表并走向另一个列表)。但是,权衡是表格所需的O(N)空间。
第三,如果允许至少临时修改数据,可以将其中一个列表循环(通过将其最后一个节点的下一个指针连接到第一个节点),然后使用Stepanov in Elements中描述的算法编程来解决O(N + M)时间和O(1)空间中的问题,因为你知道其中一个列表现在是圆形的,而另一个是P形的:它从它自己的部分开始并最终命中另一个清单的圆圈。它命中的位置称为连接点,Stepanov为您提供了一种算法来查找它。最后,您只需再次取消挂起最后一个节点。
有问题的算法实际上可以在示例章节中找到,您可以在此处下载:
答案 1 :(得分:1)
您的代码仅适用于两个列表中合并节点位于相同位置的特殊类别的情况。我不认为有这么简单, sub-O(n ^ 2)的方法 - 换句话说,你需要比较一个列表的每个节点,每一个第二个清单,反之亦然。
MergePoint (LinkList list1, LinkList list2) {
p = list1.head;
while (p != null) {
q = list2.head;
while (q != null) {
if (p == q){
System.out.print(p.value + " is the Merging node");
return;
}
q = q.next;
}
p = p.next;
}
}
答案 2 :(得分:1)
这仅在“合并节点”位于列表中的相同位置时才有效。
例如,假设您有两个链接列表......
列表1有5个节点(节点A,B,C,D,E) 列表2有6个节点(节点V,W,X,Y,C,D)
显然,公共节点是C.您在代码中寻找的是指向公共节点的节点(不知道它是否真的有名称,合并节点和其他任何节点一样好)所以在这种情况下,你正在寻找A和Y.
您的代码将执行以下操作:
A.next == V.next? no
B.next == W.next? no
C.next == X.next? no
依此类推。其格式为[列表1中的元素与列表2中的元素比较]
你真正想要做的是将List 1的第一个元素与List 2的所有元素进行比较。然后,如果找不到它,将List 1的第二个元素与列表2的所有元素进行比较,并继续这样做等等。
由于这听起来像是一个家庭作业问题,我不会给你答案(但我会给你一个提示:你可能需要嵌套循环)但是如果你有任何进一步的问题来实现它,那么就去问吧
此外,如果任一列表中的第一个节点是公共节点,可能需要查看头节点的特殊情况。在这种情况下,您只是比较“下一个”节点,这意味着如果它是两个列表中任何一个之间的公共节点,则第一个节点将不会匹配。