当前位置: 首页 > article >正文

合并2个排序的链表

合并2个排序的链表

递归解法和迭代解法

/**
 * 节点实体类
 */
class ListNode {
    public int val;
    public String name;
    public ListNode next;

    public ListNode(int val) {
        this.val = val;
    }
}

/**
 * 链表节点类
 */
class Node {

    // next存的是下个节点的引用
    Node next;

    // 值
    int val;

    //为赋值操作的 构造单链表
    public Node(int val) {
        this.val = val;
    }
}

/**
 * 递归法
 * @param list1  看原链表是升序还是降序  生序出来就是从小到大
 * @param list2
 * @return
 */
public static ListNode Merge(ListNode list1, ListNode list2) {

    // list1 list2为空的情况
    if (list1 == null || list2 == null) {
        return list1 != null ? list1 : list2;
    }
    // 两个链表元素依次对比 一开始的list1.val就是第一个  递归出来的条件:l1=null || l2=null 往上返回值了
    if (list1.val <= list2.val) {
        // 递归计算 list1.next, list2
        list1.next = Merge(list1.next, list2);  //确定1个小之后 需要将list1.next和list2进行递归  往上出来的时候 5 的话 上面节点是4
        return list1;  //从小到大
    } else {
        // 递归计算 list1, list2.next
        list2.next = Merge(list1, list2.next);   // list1就是上面去除掉 前一个节点的
        return list2;
    }
}

/**
* 第二种不是递归的 迭代法
*/
public static Node merge(Node node1, Node node2) {
if (node1 == null) {
return node2;
}
if (node2 == null) {
return node1;
}
//伪造节点 0 null 最终将合并的链表放到null的位置
Node head = new Node(0);
Node cur = head; //2个指向同一个地址 改变其中一个地址的值 另一个输出时相应改变
//有一个是null 就不进来
while (node1 != null && node2 != null) {
if (node1.val <= node2.val) {
//cur是中间作用 连接链表
cur.next = node1;
//移动取值的指针 单个链表自己移动指针 单个链表自己移动指针循环
node1 = node1.next;
}else{
cur.next = node2;
node2 = node2.next;
}
}
if (node1 == null) {
cur.next = node2;
}
// 哪个为空 循环完了 连接另一个
if (node2 == null) {
cur.next = node1;
}
return head.next;
}

编写测试类,合并2个链表 ,由小到大顺序排列

public class Test {
    public static void main(String[] args) {
        ListNode listNode1 = new ListNode(1);
        ListNode listNode2 = new ListNode(2);
        ListNode listNode3 = new ListNode(3);
        ListNode listNode4 = new ListNode(4);
        ListNode listNode5 = new ListNode(5);
        ListNode listNode6 = new ListNode(6);
        //第一个链表
        listNode1.next = listNode3;
        listNode3.next = listNode5;
        //第二个链表
        listNode2.next = listNode4;
        listNode4.next = listNode6;
        ListNode merge = solution.Merge(listNode1, listNode2);
        System.out.println(merge);

    }

}

http://www.kler.cn/a/527443.html

相关文章:

  • 【Block总结】DynamicFilter,动态滤波器降低计算复杂度,替换传统的MHSA|即插即用
  • 5.桥模式(Bridge)
  • 【美】H1B、F1、CPT、Day 1 CPT、OPT、B1/B2转F1 的核心区别及适用场景
  • WINDOWS安装eiseg遇到的问题和解决方法
  • 【编译原理实验二】——自动机实验:NFA转DFA并最小化
  • C++中的类与对象(中)
  • DeepSeek是什么,最近到底经历了什么?它能干什么?
  • 注册谷歌账号
  • Linux:多线程[2] 线程控制
  • 10.5 LangChain Model I/O 深度解析:如何用标准化接口打通大模型开发的“任督二脉”?
  • 2 MapReduce
  • 【思维导图】并发编程
  • 答疑解惑:如何监控EMC unity存储系统磁盘重构rebuild进度
  • 实战:利用百度站长平台加速网站收录
  • Agent 高频知识汇总:查漏补缺参考大全
  • 大模型本地化部署(Ollama + Open-WebUI)
  • 《TCP 网络编程实战:开发流程、缓冲区原理、三次握手与四次挥手》
  • 【4Day创客实践入门教程】Day1 工具箱构建——开发环境的构建
  • 数据包的发送流程
  • Linux命令汇总
  • 力扣017_最小覆盖字串题解----C++
  • AI学习指南HuggingFace篇-Datasets 库入门
  • [EAI-028] Diffusion-VLA,能够进行多模态推理和机器人动作预测的VLA模型
  • 研发的护城河到底是什么?
  • 双指针c++
  • 5.4.1 结构化分析方法