前言
本文主要介绍如何将多个小的升序链表合并一个大的升序链表。
需求描述
给出K个升序链接,要求把这K个升序链表合并成一个,并且这个链表也是升序的。
例如:A = [1,5,6]
, B = [2,3,8]
, C = [4,4,9]
将这3个链表合并成一个链表D
,合并后D = [1,2,3,4,4,5,6,8,9]
,并且将D
的第一个节点返回。
思路解析
我们可以采用优先级队列来实现,先把每个链表的头结点放到一个优先级队列里,优先级队列也叫小根堆。
在放小根堆的时候,谁小就把谁放在最上面。需要注意的是,我们放入的时候,放入的是节点,所以通过这个节点是可以访问整个链表的。
我们看下处理过程:
- 首先把每个链接的头结点放入小根堆中:
1,2,4
。 - 首先弹出最小的值:
1
。 - 把
1
节点的下一个节点5
放入小根堆中,此时小根堆会自动调整顺序,此时为:2, 4, 5
。 - 将
2
节点弹出,让1
节点的next
指针指向2
节点,并且将2
节点的下一个节点6
放入小根堆,此时已弹出的节点为1,2
,而小根堆为4, 5, 6
。 - 将<