仅记录,使用顺序合并,不包括分治和小顶堆(优先队列)

时间224ms,空间 28.8 MB(看脸)

思路简述

  1. 新建链表节点 res 作为答案链表的根节点
  2. 顺序遍历数组,使用 p 指针遍历数组中的每个链表
    • p 指针遍历链表时,向 res 中添加链表元素
  3. 使用前后指针 q1 和 q2 确定添加位置
    • q1 在前 q2 在后,当 q1.val 大于或等于 p.val 时,说明找到了 p 的位置(q1 和 q2 之间),此时将 q2 的下一个节点的 val 设置为 p.val、next 指向 q1 即可入链
    • 入链时需要 new 新的链表元素,直接使用 p 指针会导致重复链/断链

C# 题解

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     public int val;
 *     public ListNode next;
 *     public ListNode(int val=0, ListNode next=null) {
 *         this.val = val;
 *         this.next = next;
 *     }
 * }
 */
public class Solution {
    public ListNode MergeKLists(ListNode[] lists) {
        int n = lists.Length;
        if(n == 0) return null;
        ListNode resRoot = new ListNode(val: -10001); //链的根
        for(int i = 0; i < n; i++) { //遍历链数组
            ListNode p = lists[i], q1, q2;
            while(p != null) { //遍历每个链
                q1 = resRoot.next; //前指针
                q2 = resRoot; //后指针
                while(q1 != null) { //寻找位置
                    if(q1.val == p.val || q1.val > p.val) break;
                    q1 = q1.next;
                    q2 = q2.next;
                }
                q2.next = new ListNode(val: p.val, next: q1); // ... -> q2 -> new ListNode(this.val = p.val) -> q1 -> ...
                p = p.next;
            }
        }
        return resRoot.next; //返回根的下一个元素
    }
}

 

mumble 使用起来比 TeamSpeak 稳定,关于 TeamSpeak 可以参考阅读 部署TeamSpeak实现私人语音通讯(文章年代久远,搭建过程仅供参考)

关于自托管的聊天平台,还可以了解使用 PHP 实现的 DuckChat 部署私人通讯软件DuckChat(仅供了解,可能早已停止维护)

由于搭建过程十分简单,本文仅作记录

mumble 分为客户端和服务端,搭建好服务端后用户使用客户端连接服务端

mumble 已经纳入各大发行版的官方源,Debian 10 服务端的安装只需要执行

apt install mumble-server

之后可以使用 systemctl 管理 mumble 服务端

其他操作系统的安装方式可以查看 Installing Mumble

其配置文件默认在 /etc/mumble-server.ini 下,配置文件的详细内容可以阅读 Murmur.ini Continue reading “mumble – 自托管语音/文字聊天室”