【问题标题】:Find the merging node of two linked lists? [duplicate]找到两个链表的合并节点? [复制]
【发布时间】:2012-02-17 21:14:47
【问题描述】:
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 个链表的合并节点。 在查看其他解决方案之前,我决定编写我的代码,然后与其他现有解决方案进行比较。 我在这里采取的方法是找到两个列表指针都指向的公共节点。 你同意这个代码还是我这里缺少什么?

【问题讨论】:

  • 我喜欢帮助解决家庭作业问题——为什么不呢?
  • 显然不行。
  • @Irfy 从我在 SO 上看到的情况来看,帮助家庭作业问题没有错(就像我自己在这里一样),在发布家庭作业问题时包含“家庭作业”标签很有帮助,就这样回答的人都知道 :) (我回答作业问题会有所不同,这就是原因。)
  • 伙计们,这不是作业问题。这是亚马逊的一个面试问题,我被卡住了。我已经阅读了这个网站的规则和规定,不,我不是来这里为我的家庭作业寻求帮助的。所以在你给我一个关于寻求家庭作业帮助的大讲座之前,帮我一个忙,再读一遍我的问题!我要求提供指导、提示而不是解决方案。
  • @joshhendo 啊,好点子。 “给他鱼”与“教他如何钓鱼”的争论:-)

标签: java list linked-list


【解决方案1】:

想到了三个解决方案。

首先,Irfy 发布了嵌套循环。它使用常量内存,但时间为 O(N*M),其中 N 和 M 是两个列表的长度。

其次,您可以用空间换时间,首先将一个列表的每个节点放入一个 HashSet,然后遍历另一个列表并在 HashSet 中进行查找。因为查找是 O(1),所以总时间是 O(N+M)(构建哈希表并遍历另一个列表)。但是,代价是表需要 O(N) 空间。

第三,如果允许至少临时修改数据,则可以将其中一个列表设为循环(通过将其最后一个节点的下一个指针连接到第一个),然后使用 Stepanov 在 Elements 中描述的算法在 O(N+M) 时间和 O(1) 空间中解决问题的编程,因为您知道其中一个列表现在是圆形的,而另一个是 P 形的:它从自己的部分开始并最终命中另一个列表的圆圈。它击中的地方称为连接点,Stepanov 给你一个算法来找到它。最后,您只需再次解开最后一个节点。

有问题的算法实际上可以在示例章节中找到,您可以在这里下载:

http://www.elementsofprogramming.com/book.html

【讨论】:

    【解决方案2】:

    您的代码仅适用于合并节点在两个列​​表中的相同位置 的特殊情况。我不认为有一个简单的 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;
        }    
    }
    

    【讨论】:

    • @user664174 您的编辑被拒绝,因为完全更改现有解决方案没有任何意义——如果它与任何其他建议的不同,您应该添加自己的解决方案。
    • 我认为在这个解决方案中,复杂度应该是 O(n*m) 因为你不能假设两个链表有相同的长度。
    【解决方案3】:

    这只有在“合并节点”在列表中的相同位置时才有效。

    例如,假设您有两个链表...

    列表 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的第二个元素与List 2的所有元素进行比较,并继续这样做等等。

    因为这听起来像是一个家庭作业问题,所以我不会给你答案(但我会给你一个提示:你可能需要嵌套循环,)但是如果你对实现它有任何其他问题,然后问.

    此外,可能需要查看头节点的特殊情况,以防任一列表中的第一个节点是公共节点。在这种情况下,您只比较“下一个”节点,这意味着如果第一个节点是两个列表中任何一个之间的公共节点,则它永远不会匹配。

    【讨论】:

    • 谢谢!我正在寻找的问题范围非常小,我想到的问题实例与您描述的完全相同。在这种情况下,我将对第一个列表使用外循环,对第二个列表使用内循环,然后进行比较。但是您提到了“比较元素”与“比较下一个指针”?它比较下一个指针对吗?因为元素可以在列表中重复。
    • 元素是实际的对象,下一个指针是指向一个元素(或对象,在本例中相同的东西)的指针。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 2020-01-01
    • 1970-01-01
    相关资源
    最近更新 更多