1.数组排序
思路
(1)将全部的节点存储到数组中
(2)对数组进行排序
(3)最后创建一个全新的链表
具体代码
/**
* 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) {
int len=0;
for(int i=0;i<lists.length;i++){
ListNode p = lists[i];
while(p!=null){
len++;
p=p.next;
}
}
int[] arr = new int[len];
int k=0;
for(int i=0;i<lists.length;i++){
ListNode p = lists[i];
while(p!=null){
arr[k++]=p.val;
p=p.next;
}
}
Arrays.sort(arr);
ListNode head = new ListNode();
ListNode ans = head;
for(int i=0;i<len;i++){
ListNode newn = new ListNode();
newn.val=arr[i];
head.next=newn;
head=newn;
}
return ans.next;
}
}
2.两两比较合成链表
思路
两两合并,也就是for循环,每次两个链表进行合并,最后输出结果。
具体步骤:
(1)判断链表是否为空,不是空则p=lists[0]
(2)将p与lists中下一个列表合并,采用之前写过的两两合并方法。
(3)每次结束后后需要将p归为到原始节点,重新与下一个链表合并。
具体代码
/**
* 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) {
if(lists.length==0){
return null;
}
ListNode p = lists[0];
for(int i=1 ; i<lists.length;i++){
ListNode con = new ListNode();
ListNode init = con;
ListNode np = lists[i];
while(p != null && np != null){
if(p.val<=np.val){
con.next=p;
con=con.next;
p=p.next;
}
else{
con.next=np;
con=con.next;
np=np.next;
}
}
if(p==null){
con.next=np;
}
else{
con.next=p;
}
p=init.next;
}
return p;
}
}
3.优先队列
思路
将链表放入优先队列中(小顶堆),每次循环都去最小的加入新链表,直到队列为空。
具体步骤:
(1)构造优先队列
(2)将各个链表的首节点放入队列
(3)将最小的节点加入链表,然后该节点进入下一个位置,如果不是空的,则加入队列。
具体代码
/**
* 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) {
PriorityQueue<ListNode> pq = new PriorityQueue<>((o1,o2)->{return o1.val-o2.val;});
for(ListNode node:lists){
if(node!=null){
pq.offer(node);
}
}
ListNode ans = new ListNode();
ListNode cur = ans;
while(!pq.isEmpty()){
ListNode s=pq.poll();
cur.next=s;
cur=cur.next;
if(s.next!=null){
s=s.next;
pq.offer(s);
}
}
return ans.next;
}
}