什么是 ARTS?
- 算法(Algorithm): 每周至少一道 LeetCode 算法题,加强编程训练和算法学习
- 阅读(Review): 阅读并点评至少一篇英文技术文章,提高英文水平
- 技巧 (Tip):学习至少一个技术技巧,总结、归纳日常工作中遇到的知识点
- 分享(Share):分析一篇有观点和思考的技术文章,建立影响力,输出价值观
时间周期
10月31日至11月6日
一:算法
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
前置知识:
- 递归
- 链表
思路:
使用递归来解,将两个链表头部较小的一个与剩下的元素合并,并返回拍好序的链表头,当两条链表中的一条为空时终止递归。
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期 | 找到你的财富成长曲线-极客时间
分享理由:
- 财富自由是妄想,但是找到财富增长的具体方法,有且可以执行。
- 这几条建议搭配arts,极好
- 第一份工作不要过于关注工资。几乎没人会用第一份工作的薪资买房买车发家致富,长期来看,这个阶段工资多一点少一点几乎不会对你漫长的人生有任何影响,而选择一个好的公司、环境、方向和团队,对你的影响则是长期而深远的
四:分享
世界最深极深地下实验室:从地下2400米奔赴前沿科技星辰大海新浪四川新浪网