架构师训练营第二期 Week 8 作业
有两个单向链表(链表长度分别为 m,n),这两个单向链表有可能在某个元素合并,也可能不合并,如下图所示的这样。现在给定两个链表的头指针,在不修改链表的情况下,如何快速地判断这两个链表是否合并?如果合并,找到合并的元素,也就是图中的 x 元素。
请用代码(或伪代码)描述算法,并给出时间复杂度。
复制代码
时间复杂度是 O(m+n)。
请画出 DataNode 服务器节点宕机的时候,HDFS 的处理过程时序图。
也不知道理解的对不对。。。
有两个单向链表(链表长度分别为 m,n),这两个单向链表有可能在某个元素合并,也可能不合并,如下图所示的这样。现在给定两个链表的头指针,在不修改链表的情况下,如何快速地判断这两个链表是否合并?如果合并,找到合并的元素,也就是图中的 x 元素。
请用代码(或伪代码)描述算法,并给出时间复杂度。
class Node
attr_accessor :val, :next
def initialize(val = nil)
@val = val
end
end
def merged_linked_list(l1, l1_length, l2, l2_length)
shorter_list, longer_list = l1, l2
shorter_list, longer_list = l2, l1 if l1_length > l2_length
# 用Hash缓存短链表的节点以节省内存空间
shorter_list_nodes = {}
while shorter_list
shorter_list_nodes[shorter_list] = true
shorter_list = shorter_list.next
end
while longer_list
return longer_list if shorter_list_nodes[longer_list]
longer_list = longer_list.next
end
nil
end
l1 = Node.new
n2 = Node.new('Hello World!')
l1.next = n2
n3 = Node.new
n2.next = n3
n4 = Node.new
n3.next = n4
l2 = Node.new
n5 = Node.new
l2.next = n5
n5.next = n2
# 这个会输出Hello World!
puts merged_linked_list(l1, 4, l2, 3).val
l2 = Node.new
n5 = Node.new
l2.next = n5
# 这个会输出空
puts merged_linked_list(l1, 4, l2, 2)
时间复杂度是 O(m+n)。
请画出 DataNode 服务器节点宕机的时候,HDFS 的处理过程时序图。
也不知道理解的对不对。。。
还未添加个人签名 2018.03.21 加入
还未添加个人简介
促进软件开发及相关领域知识与创新的传播
评论