如何合并 K 个有序链表
发布于: 2021 年 06 月 07 日
该题目在 leetcode 难度定义为困难,但算是比较容易的,基本求解的思路也是比较直接简单的。
基本求解
1、循环链表数组,从各个节点中获取最小值
2、结果链表中增加新产生的最小值节点
3、循环链表中最小值节点位置的链表节点指向下个节点位置
4、重复上述过程
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
ListNode head;
List<Object> minResult = findMin(lists);
head = (ListNode)minResult.get(0);
while(minResult.get(0) != null) {
int index = (int)minResult.get(1);
ListNode node = (ListNode)minResult.get(0);
lists[index] = node.next;
minResult = findMin(lists);
//将结果链表串起来
node.next = (ListNode)minResult.get(0);
}
return head;
}
private List<Object> findMin(ListNode[] lists) {
//依题目限制的最大值
int min = 10001;
ListNode node = null;
//获取最小值和最小值的索引位置
int index = 0;
for(int i = 0; i < lists.length; i++) {
if(lists[i] == null) {
continue;
}
if(lists[i].val < min) {
min = lists[i].val;
node = lists[i];
index=i;
}
}
return Arrays.asList(node, index);
}
}
复制代码
扩展思路
1、使用优先队列处理排序
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if (lists==null || lists.length==0) return null;
//定义优先队列
PriorityQueue<ListNode> queue= new PriorityQueue<ListNode>(lists.length, (a,b)-> a.val-b.val);
//定义“工具”节点,无实际意义,仅方便“指针”处理
ListNode dummy = new ListNode(0);
ListNode tail=dummy;
//将现有头节点入队列
for (ListNode node:lists)
if (node!=null)
queue.add(node);
//循环处理,并不断取最小值
while (!queue.isEmpty()){
tail.next=queue.poll();
tail=tail.next;
if (tail.next!=null)
queue.add(tail.next);
}
return dummy.next;
}
}
复制代码
2、完成两个链表的合并操作(leetcode-21 题)
public ListNode mergeTwo(ListNode a, ListNode b) {
// merge twos.
}
public ListNode mergeKLists(ListNode[] nodes) {
ListNode result = null;
//循环处理,也可以使用归并算法的思想进行处理
for(int i=0;i<nodes.length;i++) {
result = mergeTwo(result, nodes[i]);
}
return result;
}
复制代码
划线
评论
复制
发布于: 2021 年 06 月 07 日阅读数: 8
版权声明: 本文为 InfoQ 作者【Skysper】的原创文章。
原文链接:【http://xie.infoq.cn/article/d5d393b9086f9230902ce9b6f】。文章转载请联系作者。
Skysper
关注
人生不在于谁更优秀,而在于谁更坚持 2016.03.29 加入
还未添加个人简介
评论