我的思路(逐一比较法)
有k个已经排序了的链表,每次从k个链表的头部取一个值最小的出来,放到新链表中就完事儿了。
总结:就是找出k个链表中值最小的那个头结点,然后拼接到新链表中
于是先写了个这样的
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
// 首先构造一个先的链表头结点(哑结点)
ListNode dummyNode = new ListNode(0);
// 然后再定义一个指针用来指向新链表
ListNode pos = dummyNode;
// 设置个计数器,如果有某个链表头结点不为null,就加一
Integer count = 0;
do {
// 清空计数器
count = 0;
// 找到头结点最小的那个链表
ListNode temp = null;
// 设置个标记
Integer index = -1;
for (int i = 0, len = lists.length; i < len; i++) {
// 要是个空节点,直接告辞,进行下一次循环
if (lists[i] == null) continue;
count++;
// 否则比大小
if (temp == null || temp.val > lists[i].val) {
temp = lists[i];
index = i;
}
}
// 如果没有一个链表是正常的(全空,耍我们)
if (count == 0) break;
// 如此就找到了头结点值最小的链表
ListNode newNode = new ListNode(lists[index].val);
newNode.next = null;
// 添加到新链表中
pos.next = newNode;
pos = pos.next;
// 更新lists
lists[index] = lists[index].next;
} while (count > 0);
// 返回新的链表
return dummyNode.next;
}
}
这个在官方题解中是逐一比较法
LeetCode题解说明,k表示链表的数目,N表示总共的节点数。
---------------------------------------------------------------------------------------------------------------------------------------------------
暴力法
把所有节点(假设N个)放到一个数组中处理
这里的一个稳定的排序算法,参考排序算法稳定性:https://www.cnblogs.com/Leophen/p/11397731.html