架构师训练营 - 作业 - 第八周
1、算法题
有两个单向链表(链表长度分别为 m,n),这两个单向链表有可能在某个元素合并,也可能不合并,如下图所示的这样。现在给定两个链表的头指针,在不修改链表的情况下,如何快速地判断这两个链表是否合并?如果合并,找到合并的元素,也就是图中的 x 元素。
请用代码(或伪代码)描述算法,并给出时间复杂度。
2、请画出 DataNode 服务器节点宕机的时候,HDFS 的处理过程时序图
有两个单向链表(链表长度分别为 m,n),这两个单向链表有可能在某个元素合并,也可能不合并,如下图所示的这样。现在给定两个链表的头指针,在不修改链表的情况下,如何快速地判断这两个链表是否合并?如果合并,找到合并的元素,也就是图中的 x 元素。
请用代码(或伪代码)描述算法,并给出时间复杂度。
/** * 功能:判断两个链表是否在某个节点开始,并为一条链表 * 节点重合的判定标准:地址比较,直接使用==进行内存地址比较 * 算法:暂不考虑空间复杂度,直接将链表构建为两个堆栈,然后逐一出栈比较。等于从两个链表的最后一个 * 元素向前遍历比较。算法复杂度O(n+m) * * @param list1 链表1 * @param list2 链表2 * @return 合并开始的第一个节点,如果没有重合,则返回null */ public static <T> T isMergedOfTwoList(List<T> list1, List<T> list2) { Stack<T> stackOfList1 = new Stack<>(); Stack<T> stackOfList2 = new Stack<>(); list1.stream().forEach((a)->stackOfList1.push(a)); list2.stream().forEach((a)->stackOfList2.push(a)); T firstCrossNode = null; while(!stackOfList1.isEmpty() && !stackOfList2.isEmpty()) { if ( stackOfList1.peek() == stackOfList2.peek() ) { firstCrossNode = stackOfList1.peek(); stackOfList1.pop(); stackOfList2.pop(); } else { break; } } return firstCrossNode; }
还未添加个人签名 2018.12.13 加入
还未添加个人简介
促进软件开发及相关领域知识与创新的传播
评论