写点什么

第 8 周作业

用户头像
Rocky·Chen
关注
发布于: 2020 年 12 月 13 日

一、作业说明

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

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


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


二、作业实现

package online.chenkai.loan.market.example;
import java.io.Serializable;import java.util.Objects;
/** * 链表相交判定、相交点检索 * * @author chenkai 2020-12-13 22:21:00 * @version 1.0.0 */public class NodeExample {
/** * 单向链表 */ public static class Node implements Serializable {
private static final long serialVersionUID = -4105988897516484129L; /** * 数值 */ int data;
/** * 下1节点 */ private Node next;
public Node getNext() { return next; }
public void setNext(Node next) { this.next = next; }
@Override public boolean equals(Object o) { if (this == o) { return true; } if (!(o instanceof Node)) { return false; } Node node = (Node)o; return data == node.data && Objects.equals(getNext(), node.getNext()); }
@Override public int hashCode() {
return Objects.hash(data, getNext()); } }
/** * 链表相交判定、相交点检索 * * @param head1 链表1头 * @param head2 链表2头 * * @return Node 相交点;null=不相交 */ private Node find(Node head1, Node head2) { if (Objects.isNull(head1) || Objects.isNull(head2)) { return null; }
// 链表长度 int length1 = 0; int length2 = 0; Node cursorNode1 = head1; Node cursorNode2 = head2; while (Objects.nonNull(cursorNode1.next)) { cursorNode1 = cursorNode1.next; length1++; } while (Objects.nonNull(cursorNode2.next)) { cursorNode2 = cursorNode2.next; length2++; } // 单向链表尾部相同则存在相交,反之不存在相交 if (!Objects.equals(cursorNode1.getNext(), cursorNode2.next)) { return null; } int diff = Math.abs(length1 - length2);
/* ************************ 寻找相交节点 ************************* */ // 重置指针 if (length1 > length2) { cursorNode1 = head1; cursorNode2 = head2; } else { cursorNode1 = head2; cursorNode2 = head1; } // 较长链表指针后移 for (int i = 0; i < diff; i++) { cursorNode1 = cursorNode1.getNext(); } // 相交点查询 while (!Objects.equals(cursorNode1, cursorNode2)) { cursorNode1 = cursorNode1.getNext(); cursorNode2 = cursorNode2.getNext(); } return cursorNode1; }}

复制代码


实现逻辑

  1. 判定链表尾部相交,首先判定是否相同,如相同存在相交,反之不相交

  2. 如存在相交,较长链表移动指针保持与较短链表相同长度,较少遍历次数

时间复杂度 O(m+n)

用户头像

Rocky·Chen

关注

还未添加个人签名 2018.03.03 加入

还未添加个人简介

评论

发布
暂无评论
第8周作业