PHP 合并K个升序链表-LeetCode 23

493 阅读2分钟

「这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战

今天说一下如何实现合并K个升序链表,LeetCode 23

Snipaste_2021-11-17_21-43-20.png

实现过程

暴力解法:合并所有链表后排序

把所有链表合并到一个链表中,我们可以把每个链表中的节点依次放入一个数组内,然后把所有节点排序,再输出排序后的链表就可以了。这样的逻辑最简单。

实现的代码:

Snipaste_2021-11-17_22-39-30.png

第81-87行代码,我们首先遍历链表数组中的链表,然后把链表中的节点数据依次放入数组中。

第89-90行代码,创建一个头节点或者说一个虚拟节点,方便于连接后面排序完成的链表节点。

第91行代码,用的PHP内置的函数排序,也可以自己写一个方法取排序。

第92-95行代码,遍历排序完成的数组,根据数组内的每一个元素,创建一个新节点,并把地址赋值给上一个节点的next属性。然后再把当前节点$current重新赋值为本次新创建节点的地址,便于下次遍历时接收下次创建节点的地址,以此循环。

第97行代码,返回头节点的下一个节点,就是排序完成的链表。因为头节点是空的,所以不需要头节点。

这种方式虽然逻辑简单,但是时间复杂度应该比较高,先是遍历了全部链表,然后又排序,最后又遍历输出。

但是不知道什么原因,执行的时间很短。有可能是样本比较小,也有可能是使用了PHP内置的排序函数。

下面是LeetCode上执行的结果:

Snipaste_2021-11-17_22-40-02.png

合并链表法

我们还可以把链表两两合并,逐步合并成一个有序的大链表。

使用队列

由于每个链表都是升序排列的,那么每个链表的第一个节点都是最小值。因此我们可以把每个链表的头节点进行比较,找到最小值,放入一个新链表中,最小值所属的链表去掉头节点,这个链表就有了新的最小值。然后不断重复刚才的过程,就可以实现所有的链表合并的一个有序的链表。

最后

后面两种方法的实现还没有写出来,后面写出来之后,我在补充过来。