ARTS-19

什么是 ARTS?

  1. 算法(Algorithm): 每周至少一道 LeetCode 算法题,加强编程训练和算法学习
  2. 阅读(Review): 阅读并点评至少一篇英文技术文章,提高英文水平
  3. 技巧 (Tip):学习至少一个技术技巧,总结、归纳日常工作中遇到的知识点
  4. 分享(Share):分析一篇有观点和思考的技术文章,建立影响力,输出价值观

时间周期
10月31日至11月6日

一:算法

将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

前置知识:

  1. 递归
  2. 链表

思路:
使用递归来解,将两个链表头部较小的一个与剩下的元素合并,并返回拍好序的链表头,当两条链表中的一条为空时终止递归。

JavaScript

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
function mergeTwoLists (l1, l2) {
  if (l1 === null) {
    return l2;
  } else if (l2 === null) {
    return l1;
  }

  if (l1.val < l2.val) {
    l1.next = mergeTwoLists(l1.next, l2)
    return l1;
  } else {
    l2.next = mergeTwoLists(l1, l2.next)
    return l2
  }
}

Java

class Solution {
  public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
    if (l1 ==null) {
      return l2;
    } else if (l2 == null) {
      return l1;
    } else if (l1.val < l2.val) {
      l1.next = mergeTwoLists(l1.next, l2);
      return l1;
    } else {
      l2.next = mergeTwoLists(l1, l2.next);
      return l2;
    }
  }
}

Python

class Solution:
  def mergeTwoLists(self, l1:ListNode, l2:ListNode) -> ListNode:
    if not l1: return l2
    if not l2: return l1
    if l1.val <= l2.val:
      l1.next = self.mergeTwoLists(l1.next, l2)
      return l1
    else:
      l2.next = self.mergeTwoLists(l1, l2.next)
      return l2

第二种思路:迭代
JavaScript

const mergeTwoLists = function (l1, l2) {
  const prehead = new ListNode(-1)
  let prev = prehead

  while (l1 != null && l2 != null) {
    if (l1.val <= l2.val) {
      prev.next = l1
      l1 = l1.next
    } else {
      prev.next = l2
      l2 = l2.next
    }
    prev = prev.next
  }
  prev.next = l1 === null ? l2 : l1;
  return prehead.next;
}

Java

class Solution {
  public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
    ListNode prehead = new ListNode(-1);
    ListNode prev = prehead;
    while(l1 != null && l2 != null) {
      if (l1.val <= l2.val) {
        prev.next =l1;
        l1 = l1.next;
      } else {
        prev.next = l2;
        l2 = l2.next;
      }
      prev = prev.next;
    }
    // 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可
    prev.next = l1 == null ? l2 : l1;
    return prehead.next;
  }
}

Python

class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        prehead = ListNode(-1)

        prev = prehead
        while l1 and l2:
            if l1.val <= l2.val:
                prev.next = l1
                l1 = l1.next
            else:
                prev.next = l2
                l2 = l2.next            
            prev = prev.next

        # 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可
        prev.next = l1 if l1 is not None else l2

        return prehead.next

二:阅读

Why Software Engineers like Woodworking

三:技巧

第24期 | 找到你的财富成长曲线-极客时间
分享理由:

  1. 财富自由是妄想,但是找到财富增长的具体方法,有且可以执行。
  2. 这几条建议搭配arts,极好
  3. 第一份工作不要过于关注工资。几乎没人会用第一份工作的薪资买房买车发家致富,长期来看,这个阶段工资多一点少一点几乎不会对你漫长的人生有任何影响,而选择一个好的公司、环境、方向和团队,对你的影响则是长期而深远的

四:分享

世界最深极深地下实验室:从地下2400米奔赴前沿科技星辰大海新浪四川新浪网

你可能感兴趣的:(ARTS-19)