题目描述
今天这题难度是EASY,因为做了链表的两数之和,所以应该不难做,但是一开始傻逼了,其实一开始这两个链表是有序的,每次只要比较表头的val就可以了,我sb在我将数全部取了出来,然后sorted(),再导入到一个新链表中。
# 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:
l3 = ListNode(0)
p = l3
p1 = l1
p2 = l2
t = []
while p1 and p2:
t.append(p1.val)
t.append(p2.val)
p1 = p1.next
p2 = p2.next
while p1:
t.append(p1.val)
p1 = p1.next
while p2:
t.append(p2.val)
p2 = p2.next
t = sorted(t)
for i in range(len(t)):
p.next = ListNode(t[i])
p = p.next
return l3.next
显然这样是比较慢的,因为我这个两个链表是乱序的都可以解决。
下面给出两种比较科学的
第一种就是比较两个表头,哪个小哪个导入新链表
# 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:
dummy = ListNode(0)
p = dummy
while l1 or l2:
if l1 and l2:
tmp1 = l1.val
tmp2 = l2.val
if tmp1 < tmp2:
p.next = ListNode(tmp1)
l1 = l1.next
else:
p.next = ListNode(tmp2)
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 dummy.next
第二种是递归,我一直觉得递归这个方法很难想出来,不知道大家有没有同感的·
# 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: return l2
if not l2: return l1
if l1.val < l2.val:
l1.next = self.mergeTwoLists(l1.next,l2)
return l1
else:
l2.next = self.mergeTwoLists(l1,l2.next)
return l2