极客时间架构师训练营 - week8 - 作业 1

简介: 极客时间架构师训练营 - week8 - 作业 1

有两个单向链表(链表长度分别为 m,n),这两个单向链表有可能在某个元素合并,如下图所示的这样,也可能不合并。现在给定两个链表的头指针,在不修改链表的情况下,如何快速地判断这两个链表是否合并?如果合并,找到合并的元素,也就是图中的 x 元素。

请用(伪)代码描述算法,并给出时间复杂度和空间复杂度。



思路:将其中的一个链表全部存入哈希表,然后遍历另外一个链表,如果之前的链表包含此元素,记录下此时位置,即可以判断两个链表存在合并的元素 X。

package jjn;
import java.util.Objects;
import java.util.StringJoiner;
/**
 * @author Jiang Jining
 * @date 2020/7/29 21:54
 */
public class Node {
    private Integer index;
    private String value;
    public Node() {
    }
    public Integer getIndex() {
        return index;
    }
    public void setIndex(Integer index) {
        this.index = index;
    }
    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Node node = (Node) o;
        return Objects.equals(value, node.value);
    }
    @Override
    public int hashCode() {
        return Objects.hash(value);
    }
    @Override
    public String toString() {
        return new StringJoiner(", ", Node.class.getSimpleName() + "[", "]")
                .add("index=" + index)
                .add("value='" + value + "'")
                .toString();
    }
}



package jjn;
import java.util.*;
/**
 * @author Jiang Jining
 * @date 2020/7/29 21:54
 */
public class LinkListTest {
    public static void main(String[] args) {
        List<Node> listA = new LinkedList<>();
        List<Node> listB = new LinkedList<>();
        for (int i = 0; i < 10; i++) {
            Node randomNode = getRandomNode(i);
            listA.add(randomNode);
        }
        for (int i = 0; i < 15; i++) {
            Node randomNode = getRandomNode(i);
            listB.add(randomNode);
        }
        System.out.println("listA:");
        listA.forEach(System.out::println);
        System.out.println("listB:");
        listB.forEach(System.out::println);
        Node mergingNode = getMergingNode(listA, listB);
        if (mergingNode == null) {
            System.out.println("两个链表无合并");
        } else {
            System.out.println("合并的元素是:" + mergingNode);
        }
    }
    private static Node getRandomNode(int index) {
        Node node = new Node();
        node.setIndex(index);
        node.setValue((char) (Math.random() * 26 + 'A') + "");
        return node;
    }
    private static Node getMergingNode(List<Node> listA, List<Node> listB) {
        if (listA == null || listB == null) {
            return null;
        }
        Set<Node> nodes = new HashSet<>(listA.size());
        nodes.addAll(listA);
        for (Node node : listB) {
            if (nodes.contains(node)) {
                return node;
            }
        }
        return null;
    }
}


请画出 DataNode 服务器节点宕机的时候,HDFS 的处理过程时序图。


目录
相关文章
|
4天前
|
机器学习/深度学习 算法 安全
隐私计算训练营第三讲-详解隐私计算的架构和技术要点
SecretFlow 是一个隐私保护的统一框架,用于数据分析和机器学习,支持MPC、HE、TEE等隐私计算技术。它提供设备抽象、计算图表示和基于图的ML/DL能力,适应数据水平、垂直和混合分割场景。产品层包括SecretPad(快速体验核心能力)和SecretNote(开发工具)。算法层涉及PSI、PIR、数据分析和联邦学习(水平、垂直、混合)。此外,SecretFlow还有YACL密码库和Kusica任务调度框架,Kusica提供轻量化部署、跨域通信和统一API接口。
83 0
|
8月前
|
消息中间件 缓存 NoSQL
|
9月前
|
消息中间件 存储 关系型数据库
极客时间架构实战营作业八
极客时间架构实战营作业八
117 0
|
9月前
|
消息中间件 Java 中间件
极客时间架构实战营作业六
极客时间架构实战营作业六
73 0
|
9月前
|
运维 关系型数据库 MySQL
极客时间架构实战营作业三
极客时间架构实战营作业三
100 0
|
9月前
|
SQL 分布式计算 架构师
极客时间架构师训练营 - week12 - 作业 2
极客时间架构师训练营 - week12 - 作业 2
75 0
|
9月前
|
SQL 运维 安全
极客时间架构师训练营 - week11 - 作业 2
极客时间架构师训练营 - week11 - 作业 2
28 0
|
7月前
|
资源调度 分布式计算 调度
Fink--3、Flink运行时架构(并行度、算子链、任务槽、作业提交流程)
Fink--3、Flink运行时架构(并行度、算子链、任务槽、作业提交流程)
|
9月前
|
容灾 网络协议
极客时间架构实战营模块 7 作业
极客时间架构实战营模块 7 作业
59 0
|
9月前
|
存储 缓存 负载均衡
极客时间架构实战营作业五
极客时间架构实战营作业五
91 0