牛客Top200---合并k个有序链表(java)
Posted 小样5411
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛客Top200---合并k个有序链表(java)相关的知识,希望对你有一定的参考价值。
题目
分析
首先你要会写合并两个有序链表,这个题目就是合并两个链表的变形,如果懂合并两个,那么合并k个也就不难了,只要弄一个遍历即可,一开始最前面两个合并,将合并的结果与第一个合并,以此类推,每次都进行两个两个合并,知道和最后一个合并完毕,思路都不难
代码
import java.util.*;
public class Solution {
public ListNode mergeKLists(ArrayList<ListNode> lists) {
//思路:k个有序链表合并,就是进行多次两个有序链表的合并
//首先若k=0,即为空,则直接返回null
if(lists == null || lists.size() == 0){
return null;
}
//若k=1,则直接返回这个链表,无需要排序
if(lists.size() == 1){
return lists.get(0);
}
//若k>1,则执行合并,先前两个合并,将合并后的结果再和后面的链表合并
//遍历合并
ListNode node = lists.get(0);
for(int i = 1 ; i < lists.size() ; i++){
node = mergeTwoList(node,lists.get(i));
}
return node;
}
private ListNode mergeTwoList(ListNode node1,ListNode node2){
ListNode temp = new ListNode(-1);//头结点,记录两个合并的链表
ListNode node = temp;//记录这个头结点,后面用于返回合并后的第一个节点node.next
while(node1 != null && node2 != null){
//小的先连到temp的后面
if(node1.val < node2.val){
temp.next = node1;
node1 = node1.next;
}else{
temp.next = node2;
node2 = node2.next;
}
temp = temp.next;
}
//若node1或者node2没有执行完,则直接连接到temp后面
if(node1 != null){
temp.next = node1;
}
if(node2 != null){
temp.next = node2;
}
//返回合并后的第一个节点
return node.next;
}
}
以上是关于牛客Top200---合并k个有序链表(java)的主要内容,如果未能解决你的问题,请参考以下文章
java牛客BM4.合并两个排序的链表 BM5. 合并k个已排序的链表
牛客Top200---删除链表中倒数第n个结点(java详解)