合并两个有序链表
题目描述:
解题思路:
- 第一种:这个方法我是这么理解的,首先先取一个链表的表头
lino
,然后赋给p
,之后对p
的后面链表进行修改添加。用while
来判断,如果l1
和l2
中至少有一个不是空的,那么开始排序,后面分了三种情况:第一种是l1
和l2
都不为空的情况,那么这里定义temp1
和temp2
作为这两个链表的后面元素,然后依次比较,较小的那个就先放进p
中,直到其中任意一个链表被比较完了,如果说另一个链表还剩下元素,那么就通过下面的elif
语句来把剩余的链表直接补充在已经添加完的链表p
的后面,最后比较到两个链表都为空之后,才会退出while
循环,然后返回排好序的链表了。 - 时间复杂度为 O(m+n) 。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
lino = ListNode(0)
p = lino
while l1 or l2:
if l1 and l2:
temp1 = l1.val
temp2 = l2.val
if temp1 < temp2:
p.next = ListNode(temp1)
l1 = l1.next
else:
p.next = ListNode(temp2)
l2 = l2.next
elif l1:
p.next = ListNode(l1.val)
l1 = l1.next
elif l2:
p.next = ListNode(l2.val)
l2 = l2.next
p = p.next
return lino.next
- 第二种:这个方法和第一种很类似,就是把
l1
和l2
有一个为空的情况分开来讨论,放在循环外面,直接用p.next = l1 if l1 else l2
来解决了。其他的内容都和第一种类似,所以运行速度和第一种差别并不大。 - 时间复杂度为:O(m+n) 。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
p = ListNode(-1)
head = p
while l1 and l2:
if l1.val<=l2.val:
p.next = l1
l1 = l1.next
else:
p.next = l2
l2 = l2.next
p = p.next
p.next = l1 if l1 else l2
return head.next
- 第三种:这里用到了递归的方法,运行起来还是很快的。首先也是考虑
l1
和l2
的是否为空的情况,然后解决办法和前两种方法一样,但是在解决后面的排序方法上大有学问。首先还是照常比较两个链表首元素大小,然后小的下一个元素继续比较,并且结果链表加在这个小的链表后面,一直递归下去,最后返回这个原链表,就是排序好的合并链表了。 - 时间复杂度 O(m+n) 。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
if not (l1 and l2):
return l1 if l1 else l2
if l1.val <= l2.val:
l1.next = self.mergeTwoLists(l1.next,l2)
return l1
else:
l2.next = self.mergeTwoLists(l1,l2.next)
return l2
或者
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
if l1 is None:
return l2
elif l2 is None:
return l1
elif l1.val < l2.val:
l1.next = self.mergeTwoLists(l1.next , l2)
return l1
else:
l2.next = self.mergeTwoLists(l2.next , l1)
return l2