原理
我直接放个链接开摆。
实战
分为几个步骤
- 找中点
数组的话就不多说,链表的话这样
def partion(head):
# 找到中点
fast = low = head
while fast.next and fast.next.next:
fast = fast.next.next
low = low.next
fast = low.next
# 剪断
low.next = None
return fast
- 比较
如果只有两组的话不多说,多组的话可以考虑堆排序
def mergeKLists(self, lists: List[ListNode]) -> ListNode:
lists = [i for i in lists if i]
if not lists:
return
heap = [(i.val, j, i) for i,j in zip(lists, range(len(lists)))]
no = len(lists)
heapq.heapify(heap)
dummy = cur = ListNode(0)
while heap:
_, _, min_ = heap[0]
cur.next = min_
cur = cur.next
next_ = min_.next
if next_ is not None:
heapq.heapreplace(heap, (next_.val, no, next_))
no += 1
else:
heapq.heappop(heap)
return dummy.next
- 合并
以后再说,现在做了两题都是链表相关,合起来比较简单。