算法精讲-leetcode23-合并K个排序链表**

题目描述

合并 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 +
                '}';
    }
}

运行结果

在这里插入图片描述

▄█▀█●各位同仁,如果我的代码对你有帮助,请给我一个赞吧,为了下次方便找到,也可关注加收藏呀
如果有什么意见或建议,也可留言区讨论

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值