在接受采访时我被问到,如果我们有两个链接列表在一个节点上相交,那么我们如何找到链表所在的公共节点。还可以找到最低复杂度的解决方案。
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)复杂度。但面试官并不满意。
请建议任何更好的解决方案。提前谢谢。
答案 0 :(得分:2)
给出两个单链表,找出它们是否相交。在单次迭代中执行此操作。
一个。遍历list1并找到最后一个元素
湾遍历list2并找到最后一个元素
℃。检查list1的最后一个元素== list2的最后一个元素,如果相等则不相交
这里我们只解析了一次列表:-)
还在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)
如果值为整数且内存不受限制,则可以执行以下操作:
MAX
A
MAX
X
A[X] = true
的一个列表
Y
A[Y] = true
,然后Y
是列表交集这是以O(N)时间运行的(我相信你不能做得更好,因为列表没有排序)