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 个字符等等。值得注意的是,这只是作者一个人的看法,并不代表大家都是这样,作者的技巧并不适用于每个人。
接下来,我也准备将编辑器调窄,试试作者的建议