021 - 合并两个有序链表(merge-two-sorted-lists)
/*
* @Author: lvjingshuai
* @Date: 2019-07-17 07:29:55
* @Last Modified by: lvjingshuai
* @Last Modified time: 2019-08-12
*/
文章结构 |
---|
1、题目介绍 |
2、解题 |
2.1 解法 - 暴力破解 |
2.2 解法 - 水平扫描 |
2.3 解法 - 正则表达式 |
2.4 解法 - 水平扫描 |
1、题目介绍
- 难度:简单 (系统学习算法与数据结构)
- 涉及知识:链表
- 题目编号:013
- 题目地址:https://leetcode-cn.com/problems/merge-two-sorted-lists/
- 题目内容:
将两个有序链表合并为一个新的有序链表并返回。
新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
2、解题
上面是官方使用 Java 进行的题解。
解题思路
-
要实现最终的新链表(通过拼接给定的两个链表的所有节点组成),我们需要l2 中的元素逐一插入 l1 中正确的位置。(有序)
-
那我们就需要将 l2 中的元素逐一插入 l1 中正确的位置。或者将 l1 中的元素逐一插入 l2 中正确的位置。再或者都放进一个新的结构里,其实这里因为是有序,所以,链表元素的多少长短不重要,不管哪个链表,它包含的所有元素都比前面已经合并链表中的所有元素都要大。
-
们假设 l1 元素严格比 l2元素少,我们可以将 l2 中的元素逐一插入 l1 中正确的位置。
-
那我们就开始从链表头部开始比较,调整新链表的 next 指针
-
然后,我们重复以下过程,直到 l1 或者 l2 指向了 null :如果 l1 当前位置的值小于等于 l2 ,我们就把 l1 的值接在 prev 节点的后面同时将 l1 指针往后移一个。否则,我们对 l2 做同样的操作。不管我们将哪一个元素接在了后面,我们都把 prev 向后移一个元素。
-
循环终止的时候, l1 和 l2 至多有一个是非空的。
2.1 迭代的方法来实现
解题代码:
var mergeTwoLists = function (l1, l2) {
var mergedHead = {
val: -1,
next: null
},
crt = mergedHead;
while (l1 && l2) {
if (l1.val > l2.val) {
crt.next = l2;
l2 = l2.next;
} else {
crt.next = l1;
l1 = l1.next;
}
crt = crt.next;
}
crt.next = l1 || l2;
return mergedHead.next;
};
执行测试
输入:
l1 = {
val: 1,
next: {
val: 2,
next: {
val: 4,
next: null
}
}
}
l2 = {
val: 1,
next: {
val: 3,
next: {
val: 5,
next: null
}
}
}
输出:
{
val: 1,
next: {
val: 1,
next: {
val: 2,
next: {
val: 3,
next: {
val: 4,
next: {
val:5,
next: null,
}
}
}
}
}
}
知识点
- 链表分类:有单向链表、双向链表和循环链表
- 链表的好处:个人想法: 链表添加删除元素比较方便,数据的随机访问比较麻烦
- 链表的定义:链表是由一组节点组成的集合。每个节点都使用一个对象的引用指向它的后继。指向另一个节点的引用叫做链。