数据结构与算法-合并两个有序链表
大家好,欢迎回到我们的算法学习系列。今天,我们将探讨一个在链表操作中非常实用的问题——合并两个有序链表。
什么是有序链表?
有序链表是指其中的节点按值递增或递减排列的链表。合并两个有序链表是指将两个已经排序好的链表合并成一个新的有序链表。
问题描述
给定两个有序链表的头节点,将它们合并为一个新的有序链表,并返回新链表的头节点。新链表应该通过拼接给定的两个链表的所有节点组成。
示例
- 输入:
1 -> 2 -> 4
和1 -> 3 -> 4
输出:1 -> 1 -> 2 -> 3 -> 4 -> 4
解决思路
我们可以通过迭代的方法来合并两个有序链表。基本思路是比较两个链表的头节点,将较小的节点添加到结果链表中,并移动指针到下一个节点,直到遍历完两个链表。
实现代码
下面是用JavaScript实现这个算法的代码:
function ListNode(val) {
this.val = val;
this.next = null;
}
function mergeTwoLists(l1, l2) {
let dummy = new ListNode(0);
let current = dummy;
while (l1 !== null && l2 !== null) {
if (l1.val <= l2.val) {
current.next = l1;
l1 = l1.next;
} else {
current.next = l2;
l2 = l2.next;
}
current = current.next;
}
current.next = (l1 !== null) ? l1 : l2;
return dummy.next;
}
代码解析
- 定义节点结构:
ListNode
是一个链表节点的构造函数,每个节点有一个值val
和一个指向下一个节点的指针next
。 - 创建哨兵节点:我们创建一个哨兵节点
dummy
,它的next
指针指向结果链表的头节点。这个哨兵节点使得链表操作更加方便。 - 初始化指针:定义一个指针
current
,初始时指向哨兵节点。 - 遍历两个链表:
- 比较两个链表的当前节点,将较小的节点添加到结果链表中,并移动指针到下一个节点。
- 重复上述操作,直到遍历完两个链表中的一个。
- 合并剩余节点:如果其中一个链表遍历完,直接将另一个链表剩余的节点连接到结果链表的末尾。
- 返回结果:返回哨兵节点的
next
指针,即合并后的链表的头节点。
图解
让我们通过图解来理解合并过程:
初始链表:
l1: 1 -> 2 -> 4
l2: 1 -> 3 -> 4
第一步:
dummy -> 1
l1: 2 -> 4
l2: 1 -> 3 -> 4
第二步:
dummy -> 1 -> 1
l1: 2 -> 4
l2: 3 -> 4
第三步:
dummy -> 1 -> 1 -> 2
l1: 4
l2: 3 -> 4
依次类推,直到两个链表都遍历完,最终得到合并后的链表。
小结
今天,我们介绍了合并两个有序链表的问题及其解决方法。通过迭代的方法,我们可以高效地将两个有序链表合并为一个新的有序链表,这是一个在实际开发中非常实用的操作。
感谢大家的阅读!如果你有任何问题或建议,欢迎在评论区留言。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论(0)