题目描述
将两个升序链表l1、l2合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
节点类:
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
解法一:递归
通过分析我们不难得出合并两个升序链表有如下关系,即当l1、l2其一为空时,则返回另外一个(因为和空链表合并是本身);当两者都不为空时,我们比较头结点的值,取出小的那一个节点,然后让它指向它的下一个节点和另外一个节点的合并链表。
r
e
t
u
r
n
{
l
1
l
2
i
s
N
o
n
e
l
2
l
1
i
s
N
o
n
e
l
1
−
>
m
e
r
g
e
(
l
1.
n
e
x
t
,
l
2
)
l
1.
v
a
l
<
l
2.
v
a
l
l
2
−
>
m
e
r
g
e
(
l
1
,
l
2.
n
e
x
t
)
l
1.
v
a
l
>
l
2.
v
a
l
return\left\{ \begin{array}{rcl} l1&&{l2\ is\ None}\\ l2&&{l1\ is\ None}\\ l1->merge(l1.next, l2) &&{l1.val < l2.val}\\ l2->merge(l1, l2.next) &&{l1.val > l2.val}\\ \end{array} \right.
return⎩⎪⎪⎨⎪⎪⎧l1l2l1−>merge(l1.next,l2)l2−>merge(l1,l2.next)l2 is Nonel1 is Nonel1.val<l2.vall1.val>l2.val
详细代码:
def merge(ListNode1, ListNode2):
if not ListNode1:
return ListNode2
if not ListNode2:
return ListNode1
if ListNode1.val < ListNode2.val:
ListNode1.next = merge(ListNode1.next, ListNode2)
return ListNode1
else:
ListNode2.next = merge(ListNode1, ListNode2.next)
return ListNode2
该算法时间复杂度是O(N+M),其中N、M分别是两个链表的长度
解法二:同时遍历两个链表
还有另外一种方法是,我们可以同时遍历两个链表,每次遍历找出值较小的那一个,添加到合并后链表中,然后指针往前挪一位。
详细代码:
def merge(ListNode1, ListNode2):
# 定义一个链表用于记录合并结果
resultListNode = ListNode(-1)
# 定义一个“指针”链表,指向resultListNode的最后一个节点,用于遍历
tmpListNode = resultListNode
while ListNode1 and ListNode2:
if ListNode1.val < ListNode2.val:
tmpListNode.next = ListNode1
ListNode1 = ListNode1.next
else:
tmpListNode.next = ListNode2
ListNode2 = ListNode2.next
tmpListNode = tmpListNode.next
# 这一步目的是处理遍历完之后,有一个链表为空,而另外一个链表不为空的情况,不为空的链表节点值肯定都是最大的(因为链表是升序的,而我们每次遍历都是取小的那个),所以都放在末尾。
tmpListNode.next = ListNode1 if ListNode1 else ListNode2
return resultListNode.next