Java算法每日一题

题目描述

将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:l1 = 1,2,4, l2 = 1,3,4输出:1,1,2,3,4,4

解题思路
  • 递归法:比较两个链表的头节点,取较小的节点作为当前节点,然后递归合并剩余节点;
  • 迭代法(推荐):用虚拟头节点简化边界处理,遍历两个链表,依次拼接较小的节点。
Java 代码(迭代法)
复制代码
// 定义链表节点
class ListNode {
    int val;
    ListNode next;
    ListNode() {}
    ListNode(int val) { this.val = val; }
    ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}

public class MergeTwoLists {
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        // 虚拟头节点,简化链表拼接
        ListNode dummy = new ListNode(-1);
        ListNode curr = dummy;
        
        // 遍历两个链表,直到其中一个为空
        while (list1 != null && list2 != null) {
            if (list1.val <= list2.val) {
                curr.next = list1;
                list1 = list1.next;
            } else {
                curr.next = list2;
                list2 = list2.next;
            }
            curr = curr.next;
        }
        
        // 拼接剩余的节点(其中一个链表可能还有未遍历的节点)
        curr.next = list1 == null ? list2 : list1;
        
        return dummy.next;
    }

    // 测试用例:打印链表
    public static void printList(ListNode head) {
        while (head != null) {
            System.out.print(head.val + " ");
            head = head.next;
        }
    }

    public static void main(String[] args) {
        // 构建链表1: 1->2->4
        ListNode l1 = new ListNode(1, new ListNode(2, new ListNode(4)));
        // 构建链表2: 1->3->4
        ListNode l2 = new ListNode(1, new ListNode(3, new ListNode(4)));
        
        MergeTwoLists solution = new MergeTwoLists();
        ListNode result = solution.mergeTwoLists(l1, l2);
        // 输出:1 1 2 3 4 4
        printList(result);
    }
}
答案解析
  • 虚拟头节点dummy的作用:避免处理 "头节点为空" 的边界情况;
  • 时间复杂度:O (m+n)(m、n 为两个链表长度),空间复杂度:O (1)。
相关推荐
一去不复返的通信er5 分钟前
力扣15:盛最多水的容器
算法·leetcode
努力实干7 分钟前
第二阶段 · 第 7 课:C++ 多线程与线程安全
开发语言·c++·安全
Navigator_Z8 分钟前
LeetCode //C - 1309. Decrypt String from Alphabet to Integer Mapping
c语言·算法·leetcode
潇湘秦11 分钟前
SQL Server 2016+ 整数类型元数据扩宽(秒级变更)完整说明
数据库·算法
MetaLite17 分钟前
Spring Boot 加了 @Valid,嵌套参数为什么还没校验?
java·spring boot·后端
半杯咖啡半行码18 分钟前
QML与 Qt Quick入门实战:从零基础到 C++ 双向通信详解
java·qt·交互
霸道流氓气质24 分钟前
Lingua 语言检测库:n-gram 统计模型、置信度阈值调优与 Spring Boot 分层检测管道的生产级实战
java·spring boot·后端
爱聊灵光的维C30 分钟前
C语言初阶:关于函数设计的详细讲解和注意事项
c语言·开发语言·青少年编程·蓝桥杯·学习方法
文丑颜不良啊35 分钟前
LeetCode1281~1300题目解析
java·leetcode
熊猫钓鱼>_>37 分钟前
上架审核常见驳回与隐私合规清单:过审前先自查这 8 条【鸿蒙心迹】
开发语言·前端·华为·华为云·harmonyos·openharmony·ai制作