【架构师训练营第 1 期 08 周】 作业
【架构师训练营第 1 期 08 周】 作业
1.有两个单向链表(链表长度分别为 m,n),这两个单向链表有可能在某个元素合并,也可能不合并,如下图所示的这样。现在给定两个链表的头指针,在不修改链表的情况下,如何快速地判断这两个链表是否合并?如果合并,找到合并的元素,也就是图中的 x 元素。
请用代码(或伪代码)描述算法,并给出时间复杂度。
2.请画出 DataNode 服务器节点宕机的时候,HDFS 的处理过程时序图。
解答:
1.
先分析题目关键词:
单向链表:不是双向的,分为有环和无环,有环即最后一个元素的指针指向链表中其中一个元素(可以生动理解为数字“6”的书写顺序),无环即最后一个元素的指针指向null;
合并:单向链表如果有元素合并,即这个元素后面的所有元素完全相同,因为每个元素的指针都指向相同的下一个元素。
思路:
如果有环的情况下,两个链表的环肯定是大小一样的,所以最好先把链表解环,把最后一个元素的next指针变成null,这样所有方式都是通过对比无环链表来寻找合并元素。解环通过双指针来解,只要能套圈就是有环。
无环情况下:
第一种方法最简单粗暴,双循环嵌套查询,匹配相同则会合并,如果指针不相同就不会合并,时间复杂度O(n^2);
第二种方法利用链表合并的特性,得出两个链表如果合并,则从后往前的p个元素完全一致,且p小于等于m和n之间的最小值。
这样取出链表放入队列中,修整长度后,一起比较,存在相等的元素则会合并,而且第一个相等的元素就是第一个合并的元素。时间复杂度:O(2m+n)
节点数据结构:
代码实现:
第三种网上看到介绍Stack Overflow一个优雅的写法,利用两个链表长度差,循环位移对比,如果有相同的元素则返回。两个元素相同的时候如果是null即不合并,如果不是null即会合并。其实也和方法二前半段思路一样,最终实现链表对齐比较。
2.HDFS处理DataNode宕机时序图
版权声明: 本文为 InfoQ 作者【Bear在挨踢】的原创文章。
原文链接:【http://xie.infoq.cn/article/bc0343fa1282b98472359f3dd】。文章转载请联系作者。
评论