题目描述
合并 k 个排序链表,返回合并后的排序链表。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
解题思路
链表两两合并,最终剩下一个链表就是所需结果。
合并方式为:
代码示例
public class Test {
public static void main(String[] args) {
List<Node> list = new ArrayList<>();
//初始化node链表
initNodeLinked(list);
//输出初始化的链表
for (int i=0; i< list.size(); i++){
printValueList(list.get(i), i +"");
}
//合并
Node nodeResult = mergeLinked(list);
//输出初始化的链表
printValueList(nodeResult, "【最终结果】");
}
private static Node mergeLinked(List<Node> list) {
int size = list.size();
Map<Integer, Node> map = new HashMap<>();
while (size > 1){
for (int i = 0; i < size/2; i++){
//首尾链表合并放在首端
list.set(i, mergeTwoLinked(list.get(i), list.get(size - 1 - i)));
}
size = (size + 1)/2;
}
return list.get(0);
}
//合并两个链表
private static Node mergeTwoLinked(Node node1, Node node2) {
//指针start一直指向结果集链表的最【首端】
Node start = new Node(-1);
//指针p一直指向结果集链表的最【尾端】
Node p = start;
while (node1 != null && node2 != null){
if (node1.value > node2.value){
p.next = node2;
node2 = node2.next;
}else {
p.next = node1;
node1 = node1.next;
}
p = p.next;
}
if (node1 != null){
p.next = node1;
}
if (node2 != null){
p.next = node2;
}
return start.next;
}
private static void printValueList(Node node,String num) {
ArrayList<Integer> numList = new ArrayList<>();
while (node != null){
numList.add(node.value);
node = node.next;
}
System.out.println("第"+num+"条链表的value集合为:"+numList);
}
private static void initNodeLinked(List<Node> list) {
//1->2->3->4->5
Node node1 = new Node(10);
for (int i=10; i>0; i--){
Node nodeTemp = new Node(i);
nodeTemp.next = node1;
node1 = nodeTemp;
}
//1->2->3->4->5
Node node2 = new Node(10);
for (int i=10; i>0; i--,i--){
Node nodeTemp = new Node(i);
nodeTemp.next = node2;
node2 = nodeTemp;
}
//1->2->3->4->5
Node node3 = new Node(15);
for (int i=15; i>0; i--,i--){
Node nodeTemp = new Node(i);
nodeTemp.next = node3;
node3 = nodeTemp;
}
//1->2->3->4->5
Node node4 = new Node(15);
for (int i=15; i>0; i--,i--){
Node nodeTemp = new Node(i);
nodeTemp.next = node4;
node4 = nodeTemp;
}
//1->2->3->4->5
Node node5 = new Node(30);
for (int i=30; i>0; i--,i--,i--,i--){
Node nodeTemp = new Node(i);
nodeTemp.next = node5;
node5 = nodeTemp;
}
list.add(node1);
list.add(node2);
list.add(node3);
list.add(node4);
list.add(node5);
}
}
//Node节点
class Node{
public Integer value;
public Node next;
public Node(Integer value) {
this.value = value;
}
@Override
public String toString() {
return "Node{" +
"value=" + value +
", next=" + next +
'}';
}
}
运行结果
▄█▀█●各位同仁,如果我的代码对你有帮助,请给我一个赞吧,为了下次方便找到,也可关注加收藏呀
如果有什么意见或建议,也可留言区讨论