前言

大家好,我是「程序员小熊」。今天给大家带来一道「链表」相关的题目,这道题同时也是字节、腾讯、亚马逊和微软等大厂的面试题,即力扣上的第 21 题-合并两个有序链表。

本文主要介绍「递归」「迭代」两种策略来解答此题,供大家参考,希望对大家有所帮助。

合并两个有序链表

解题思路

要想将两个「升序」链表合并成一个新的「升序」链表,比较容易想到通过「递归」去实现。

方法一:递归

采用递归的「主要思路」

假设链表分别为 A 和 B,先比较 A 和 B 的头节点的值的大小,选择头节点值较小者(假设为 A)作为新的链表的头节点;然后再比较 A 的第二个节点的值与 B 的头节点的值的大小关系,选择较小者作为新链表的第二个节点;依次类推找出新链表的第三个节点...

❝ 递归终止条件:两链表一个为空时,结束递归。

Show me the Code

「C」

「C++」

「Java」

「Python3」

「Golang」

「复杂度分析」

时间复杂度:「O(n + m)」,其中 n 和 m 分别为两个链表的长度,需要递归调用两个链表的每个节点一次。

空间复杂度:「O(n + m)」

方法二:迭代

除了采用递归外,还可以采用迭代的方法,具体如何操作,如下例子所示:

「举例」

以链表 l1:1->4->null 和链表 l2:2->3->null 为例。

设置两个指针 cur1 和 cur2,分别指向两个链表的头节点;

比较 cur1 和 cur2 指向的节点的值的大小,右移指向的节点值较小的 cur1;

设置一个指针 pre1,记录上次比较时值较小的节点;

设置一个指针 next,记录 cur2 指向节点的下一节点;

由于 pre1 指向的节点值小于 cur2 指向的节点值,连接它们;

同时由于 cur2 指向的节点小于 cur1 指向的节点,连接它们;

右移 pre1 和 cur2 分别到 cur2 和 next 位置;

由于 cur1 指向的节点值大于 cur2 指向的节点值,将 pre1 指向的节点连接 cur2 指向的节点;

由于 cur2 指向的节点值小于 cur1 指向的节点值,连接它们;

采用迭代法,合并两个上升链表到一个的完整过程,如下动图示:

Show me the Code

「C」

「C++」

「Java」

「复杂度分析」

时间复杂度:「O(n + m)」,其中 n 和 m 分别为两个链表的长度,需要遍历两个链表的每个节点。

空间复杂度:「O(1)」,未开辟额外空间。

链表往期精彩回顾

更多精彩

关注公众号「程序员小熊」