三指针归并排序
归并排序一般是两个链表合成第三个链表,比较典型,直接用归并排序法设置三个指针,前两个分别是要合的链表,第三个是要合成的链表
在这里插入代码片
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
m = ListNode(0)
l = m
while l1 and l2:
if l1.val > l2.val:m.next, l2 = l2, l2.next
else: m.next, l1 = l1, l1.next
m = m.next
if not l1:
m.next = l2
else:
m.next = l1
return l.next
很明显最后的if那里还可以优化下:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
cur = dum = ListNode(0)
while l1 and l2:
if l1.val < l2.val:
cur.next = l1
l1 = l1.next
else:
cur.next, l2 = l2, l2.next
cur = cur.next
cur.next = l1 if l1 else l2
return dum.next
递归法的归并排序
首先对比值确定头节点,依次递归比较到l1或者l2不存在,接上链表。返回头节点
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
if not l1 or not 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
菜逼一枚,再看浙大数据结构的课慢慢刷leetcode。