ARTS Week 12

Algorithm

本周的 LeetCode 题目为:160. 相交链表

题目简介:给你两个单链表的头节点 headAheadB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 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 个字符等等。值得注意的是,这只是作者一个人的看法,并不代表大家都是这样,作者的技巧并不适用于每个人。

接下来,我也准备将编辑器调窄,试试作者的建议

上一篇:剑指 Offer 52. 两个链表的第一个公共节点


下一篇:剑指 Offer II 023. 两个链表的第一个重合节点