合并两个有序链表
Geek-James opened this issue · 0 comments
Geek-James commented
一、啥是链表?
- 1.是由一组节点组成的的集合,其中每个数据项都是一个节点的一部分,每个节点还包含指向下一个节点的链接。
- 2.链表是结构体最重要的应用,
它是一种非固定长度的数据结构,是一种动态存储技术,
它能够根据数据的结构特点和数量使用内存,尤其适用于数据个数可变的数据存储。
二、链表的基本元素有哪些?
- 1.节点:每个节点有两个部分,左边部分称为值域,用来存放用户数据;右边部分称为指针域,用来存放指向下一个元素的指针。
- 2.head:head节点永远指向第一个节点
- 3.tail: tail永远指向最后一个节点
- 4.None:链表中最后一个节点的指针域为None值
头指针与头结点以及首元结点的关系:
三、如何合并两个有序链表?
问题分析
- 1、考虑两个链表L1,L2中数据的多少
- 2、空值的情况
- 3、用两个指针同时遍历两个有序链表L1,L2,并且比较每次读取的两个链表元素的数值,将其中的小值插入到新的链表L中。
- 4、考虑到其中链表L1(或者L2)由于元素少,而被先遍历完,另个链表L2(或者L1)直接接在新的链表L表尾;
- 5、函数返回新链表L的表头。
实现要点
1、设置指针t1遍历L1,指针t2遍历L2,指针Ptr指向合适的结点(在L1中的结点,或者L2中的结点)来构造新的链表L。
代码实现方案一:创建一个新的链表用来存储排列数据, 然后用while循环检测l1和l2中的val
值,如果l1.var<=l2.var
,那么就让新链表的next
指针指向l1的val,
,然后改变l1
的指针指向并且将l1
的下一个值指向l1
,依次迭代,反之,如果l1.val>l2.var
那么就让新链表的next
指针指向l2
的val,
,然后改变l2
的指针指向并且将l2
的下一个值指向l2
,依次迭代,直到左右节点迭代完,判断l1
是否为空,返回新链表l3
.
<script>
function mergeTwoLists(l1, l2) {
var l3 = new ListNode(-1);
var c3 = l3;
while (l1 !== null && l2 !== null) {
if (l1.val <= l2.val) {
c3.next = l1;
l1 = l1.next;
} else {
c3.next = l2;
l2 = l2.next;
}
c3 = c3.next;
}
c3.next = (l1 === null) ? l2 : l1;
return l3.next;
}
// 自定义一个链表
function ListNode(val) {
this.val = val;
this.next = null;
}
</script>
实现方法二:递归
function mergeTwoLists(l1, l2) {
if (l1 = null && l2 == null) {
return null;
}
if (l1 == null) {
return l2;
}
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;
}
}
可以复制以上代码到leetcode-合并连个有序链表进行验证。
欢迎小伙伴评论区提出更好的解决方案,记得点赞👍鼓励下哦!
参考链接:
扫一扫下面的二维码,回复学习即可免费领取最新前端学习资料,也希望在前端进阶的路上,我们一起成长,一起进步!