Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
题意表述异常简练:合并多个有序链表
虽然题目不长,但是这道在LeetCode上却是被标记为hard的题目。
自己在做这道题的时候,受两个有序链表合并题目,用两个指针不断比较,逐步前进的影响,所以开始想用多个指针,即建一个vector 来存储跟踪每一行即将被添加的数的所有指针。
但是这样有两个问题:
每次指针所指数被添加到总列表后需要将指针往前挪一位,不如vector下标的自增方便
循坏的结束
需要所有指针都指到最后,即都为NULL,两个还好,
多个就不好判断了
。转化成vector就好判断多了:
- 在每一行的最后加入一个最大的数INF,这样这个数永远不会被加到总列表中
- 统计原来的多个列表总共有多少个节点,即allNodes
- 这样循环allNodes次之后必能将所有的节点加入到总列表中了
具体实现:
1 | // |
看了Discussion后,发现大佬的解法更为简单,即采取分而治之(Divide and Conquer)的思想。
两个有序链表不是很简单吗?那么多个有序的列表难道不是不断的两两合并,最后合到只剩下一个为止?
1 | ListNode *mergeKLists(vector<ListNode *> &lists) { |