ARTS Week 12
Algorithm
本周的 LeetCode 题目为:160. 相交链表
题目简介:给你两个单链表的头节点 headA
和 headB
,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null
。题目数据 保证 整个链式结构中不存在环。注意,函数返回结果后,链表必须保持其原始结构。示例如下:
输入:
A: 4->1->
8->4->5
B: 5->0->1->
输出:
8
第一种思路就是使用集合 HashSet
,将链表 A 都加入集合中,然后遍历链表 B,检查是否存在于集合中,若存在则表明相交,反之不存在。通过的代码如下:
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
HashSet<ListNode> nodeSet = new HashSet<>();
ListNode curr = headA;
while (curr != null) {
nodeSet.add(curr);
curr = curr.next;
}
curr = headB;
while (curr != null) {
if (nodeSet.contains(curr)) {
break;
} else {
curr = curr.next;
}
}
return curr;
}
}
第二种思路就是通过遍历链表,两个指针 pA,pB 分别指向链表 A,B,当 pA 指针遍历到链表 A 结束后,再开始遍历链表 B;同理,当 pB 指针遍历到链表 B 结束后,再开始遍历链表 A。判断 pA 与 pB 是否相等,若相交则返回相交的节点,若不相交则 pA 与 pB 都为 null
时会停止遍历。通过代码如下:
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA == null || headB == null) {
return null;
}
ListNode curr1 = headA;
ListNode curr2 = headB;
while (curr1 != curr2) {
curr1 = (curr1 == null) ? headB : curr1.next;
curr2 = (curr2 == null) ? headA : curr2.next;
}
return curr1;
}
}
Review
本周 Review 的英文文章为:缩短写作的列宽以加快写作速度
作者在这篇文章中分享了自己提高写作效率的技巧,那就是将编辑器的宽度调窄。这样做不仅可以提高写作速度,同时也提高了写作质量。因为越短的列,阅读起来会更快一些,随着阅读速度的提高,写作速度也会得到提高;因为列变短了,不需要频繁的移动眼睛来获取到更多的内容,在编程中,我们也经常设置一个最长列宽,比如 80 个字符,120 个字符等等。值得注意的是,这只是作者一个人的看法,并不代表大家都是这样,作者的技巧并不适用于每个人。
接下来,我也准备将编辑器调窄,试试作者的建议 😃
Tip
sudo
命令会先调用 fork()
创建一个子进程,而后改变用户及权限,最后调用 exec()
来运行执行具体的程序。因为用户即权限发生了变化,这就会导致某些环境变量可能不可用。
Share
每周的 ARTS 已经进入了正轨,同时也慢慢养成了提前准备素材的习惯。现在的 ARTS 基本上是按照分为四个部分写成的,而并不是像过去那样一次性写成的。其实个人很难发现这两种写作方式得到的最终文章的区别,不知道各位读者能不能看出来?但分部分写会降低我的压力,自我感觉一次性写完写出来的并不是很好?
自己未来应该还会分部分写,因为后面打算写一些其他方面的技术文章,单独的一篇文章还是一次性写好为好。