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)。
相关推荐
阿维的博客日记12 小时前
MultipartFile 是不是表示仅仅是一个分片?
java·后端·spring·multipartfile
renhongxia112 小时前
世界模型,是“空中楼阁”还是AGI的“最后一块拼图”?
运维·服务器·数据库·人工智能·算法·agi
程序员无隅13 小时前
Coding Agent 为什么压缩上下文后还能继续工作?上下文模块设计拆解
java·开发语言·数据库
Python+9913 小时前
Java 枚举类(Enum)详解:从基础到高级应用
java·开发语言·python
二炮手亮子13 小时前
浅记java线程池
java·开发语言
一路向北North13 小时前
Spring Security OAuth2.0(23):分布式系统授权-转发明文给微服务
java·spring·微服务
zmzb010314 小时前
C++课后习题训练记录Day157
开发语言·c++
dunge202614 小时前
2026年7月最新ChatGPT Plus / Pro 与 Codex:当 AI Agent 最新5.6版本来袭,必须理解事务、幂等与补偿
开发语言·人工智能·python
zephyr0515 小时前
动态规划-最长上升子序列问题
算法·动态规划
闪电悠米15 小时前
力扣hot100-56.合并区间-排序详解
数据结构·算法·leetcode·贪心算法·排序算法