趣味算法题

越刷越上头的趣味算法题
帅旋
关注
充电
IT宅站长,技术博主,架构师,全网id:arthinking。

迭代法:合并两个有序链表

发布于 2024-03-18 | 更新于 2024-08-21

题目:21. 合并两个有序链表[1]

如果您已经有思路了,或者是N刷了,可以先自己写一遍。

题目分析

合并两个有序链表是一个常见的算法问题,要求将两个升序链表合并为一个新的升序链表并返回。

这个问题可以通过迭代法解决。

解题思路

  • 哨兵节点(dummy):无论合并过程如何进行,哨兵节点始终指向新链表的头部;
  • 迭代:通过迭代遍历两个链表,每次比较两个链表当前节点的值,选择较小值的节点接到当前节点(current)的后面,然后移动所选节点的链表指针(l1l2)和current指针;
  • 合并剩余部分:一旦一个链表先遍历完,将另一个链表的剩余部分直接接到当前节点的后面。

Java解法

下面是使用Java语言的解法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
// 创建哨兵节点
ListNode dummy = new ListNode(-1);
ListNode 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 ? l2 : l1;

return dummy.next;
}
}

时间复杂度

时间复杂度主要取决于两个链表的长度。在合并过程中,每个元素都会被访问和比较一次,直到所有元素都被合并到结果链表中。因此,如果两个链表的长度分别为 nm,那么算法的时间复杂度为 O(n + m)。这表示算法的运行时间与两个链表的总长度线性相关。

空间复杂度

迭代解法的空间复杂度主要由额外使用的变量(如哨兵节点和一些临时变量)决定,它们的数量与输入的链表长度无关,因此是常数级别的。所以,算法的空间复杂度为 O(1)。这意味着算法的空间消耗不随输入数据的大小而变化,仅使用了固定的额外空间。

References


  1. 21. 合并两个有序链表 ↩︎

本文作者: 帅旋

本文链接: https://www.itzhai.com/columns/algorithm/merge-two-sorted-lists.html

版权声明: 版权归作者所有,未经许可不得转载,侵权必究!联系作者请加公众号。

×
IT宅

关注公众号及时获取网站内容更新。

请帅旋喝一杯咖啡

咖啡=电量,给帅旋充杯咖啡,他会满电写代码!

IT宅

关注公众号及时获取网站内容更新。