这个系列没啥花头,就是纯 leetcode 题目拆解分析,不求用骚气的一行或者小众取巧解法,而是用清晰的代码和足够简单的思路帮你理清题意。让你在面试中再也不怕算法笔试。
14. 合并两个有序链表 (merge-two-sorted-lists)
标签
- 递归
- LinkList
- 简单
题目
这里不贴题了,leetcode打开就行,题目大意:
合并 2 个有序链表。
相关知识
我认为递归就是
- 有递归出口
- 自己调用自己
写递归代码的关键就是找到如何
将大问题分解为小问题的规律
,并且基于此写出递推公式
,然后再推敲终止条件
,最后将递推公式和终止条件翻译成代码
。
编写递归代码的关键是,只要遇到递归,我们就把它抽象成一个
递推公式
,不用想一层层的调用关系
,不要
试图用人脑去分解递归的每个步骤
。
基本思路
- 终止条件:当两个链表都为空时,表示我们对链表已合并完成。
- 如何自己调用自己:我们判断 l1 和 l2 头结点哪个更小,然后较小结点的 next 指针指向其余结点的合并结果。(调用递归)
递归写法实现
var mergeTwoLists = function(l1, 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
}
};
迭代写法实现
var mergeTwoLists = function(l1, l2) {
// 还是用一个前置节点
let prehead = new ListNode(0)
let prev = prehead
while (l1 && l2) {
if (l1.val < l2.val) {
prev.next = l1
l1 = l1.next
} else {
prev.next = l2
l2 = l2.next
}
prev = prev.next
}
// 合并还未被合并完的剩下的直接用链表末尾指向即可
prev.next = l1 ? l1 : l2
return prehead.next
};
年初四就来一题吧。
今天就到这儿,想跟我一起刷题的小伙伴可以加我微信哦
搜索我的微信号infinity_9368
,可以聊天说地
加我暗号 "天王盖地虎" 下一句的英文
,验证消息请发给我
presious tower shock the reiver monster
,我看到就通过,暗号对不上不加哈