找到两个相交链表的公共节点

时间:2013-10-06 18:11:59

标签: c data-structures linked-list

在接受采访时我被问到,如果我们有两个链接列表在一个节点上相交,那么我们如何找到链表所在的公共节点。还可以找到最低复杂度的解决方案。

e.g。

      ![Linked List example][1]

链接列表1 = 11-> 12-> 13-> 14-> 15-> 16-> 17-> 54

链接列表2 = 23-> 24-> 13-> 26-> 14-> 15-> 35-> 16-> 45

我回答他说我们可以在hashmap中存储一个链表的地址,并将第二个列表中每个节点的地址与hashmap进行比较。这样我们就可以实现O(n)复杂度。但面试官并不满意。

请建议任何更好的解决方案。提前谢谢。

2 个答案:

答案 0 :(得分:2)

如果两个链表在某个节点处相交,则可以更好地实现监听,这样我们就可以遍历列表中的每个列表的长度,然后将一个列表的指针移动到两个列表之间的距离。然后每当你得到那个指针都相等的那个节点时,同时按指针移动指针。

  1. 给出两个单链表,找出它们是否相交。在单次迭代中执行此操作。

    一个。遍历list1并找到最后一个元素

    湾遍历list2并找到最后一个元素

    ℃。检查list1的最后一个元素== list2的最后一个元素,如果相等则不相交

  2. 这里我们只解析了一次列表:-)

    1. 还在O(n)时间和O(1)空间中找到交叉节点 在这里他们要求在O(1)空间中这样做,所以我们只需要使用一个变量:-)

      一个。创建一个变量(int)diff = 0

      湾解析每个节点的list1和增量diff

      ℃。解析list2并减少每个节点的差异

      d。如果diff是> 0 list1更大,所以按diff次按list1的指针 else list2更大,所以按mod(diff)次

      按下list2的指针

      即现在检查两个指针​​是否相等,直到我们到达结束

答案 1 :(得分:0)

如果值为整数且内存不受限制,则可以执行以下操作:

  1. 遍历每个列表一次,找到全局最大值MAX
  2. 分配大小为A
  3. 的布尔数组MAX
  4. 遍历列表集X
  5. 中的每个值A[X] = true的一个列表
  6. 遍历第二个列表,对于列表中的每个值Y A[Y] = true,然后Y是列表交集
  7. 这是以O(N)时间运行的(我相信你不能做得更好,因为列表没有排序)