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)。
相关推荐
zzzll11112 小时前
Claude Code离线安装方案揭秘
开发语言·php
wabs6663 小时前
关于图论【卡码网117.软件构建的思考】
数据结构·算法·软件构建·图论·卡码网
mifengxing3 小时前
LeetCode 41.缺失的第一个正数|Hard题O(n)+O(1)最优解法深度解析
java·算法·leetcode·排序算法
wling03013 小时前
vasp虚频计算-python脚本
开发语言·windows·python·vasp计算
郝学胜-神的一滴4 小时前
Qt 高级编程 040:按钮悬浮弹出滑块弹窗的完整攻略
开发语言·c++·qt·软件工程·用户界面
Tongzhi20264 小时前
从部署到运维:通芝科技无感考勤一体机的全流程效率解析
运维·数据结构·科技·算法·贪心算法
Wang's Blog4 小时前
AI Agent白手起家30: 动态示例选择器之根据长度选择 Few Shot 示例
算法
xrandzj4 小时前
Python面向对象编程入门:类、实例、初始化与封装实践
开发语言·python
DLYSB_5 小时前
API 网关流量洪峰与突发 CC 攻击:我用 Go 写了个“现场物理防御哨兵”,把故障响应压缩到秒级
开发语言·后端·golang·报警灯
markinmarkin6 小时前
Spring 中Bean 的作用域有哪些?
java·后端·spring