三个月算法进阶--day11
目录
链表如何遍历更优雅?
leetcode第23题合并K个升序数组
双指针,一个遍历,一个定位插入
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
def merge2list(alist, blist):
ans = alist
prev = ListNode(None, ans)
ptr = ans
while blist != None:
insert_value = blist.val
while ptr != None:
if insert_value <= ptr.val:
prev.next = ListNode(insert_value, ptr)
if prev.val == None:
ans = prev.next
prev = prev.next
break
ptr = ptr.next
prev = prev.next
else:
prev.next = ListNode(insert_value)
prev = prev.next
blist = blist.next
return ans
def merge2list(alist, blist):
if not alist return blist
if not blist return alist
head = ListNode()
tail = head
while alist and blist:
if alist.val < blist.val:
tail.next = alist
alist = alist.next
else:
tail.next = blist
blist = blist.next
tail = tail.next
tail.next = alist if alist else blist
return head.next
def merge2list(alist, blist):
if not alist: return blist
if not blist: return alist
if alist.val < blist.val:
alist.next = merge2list(alist.next, blist)
return alist
else:
blist.next = merge2list(blist.next, alist)
return blist
优先队列用二叉堆
heap = []
heapq.heappush(heap, num)
heapq.heappop(heap) # 弹出最小元素
heapq.heapify(nums)
分治,Left && Right
def merge(left, right):
if left > right:
return
if left == right:
return lists[left]
mid = (left + right) // 2
l1 = merge(left, mid)
l2 = merge(mid+1, right)
return