【中等】题解力扣21:合并两个有序链表

题目详情

将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例 1:

输入:l1 = [1,2,4], l2 = [1,3,4]

输出:[1,1,2,3,4,4]

示例 2:

输入:l1 = [], l2 = []

输出:[]

示例 3:

输入:l1 = [], l2 = [0]

输出:[0]

提示:

  • 两个链表的节点数目范围是 [0, 50]
  • -100 <= Node.val <= 100
  • l1l2 均按 非递减顺序 排列

解题思路

  1. 迭代法:使用哑节点(dummy node)简化链表操作,避免处理头节点为空的边界情况。
  2. 双指针遍历 :同时遍历两个链表,比较当前节点的值:
    • 将较小值的节点链接到新链表。
    • 移动较小值节点所在链表的指针。
  3. 拼接剩余节点:当其中一个链表遍历完成后,将另一个链表的剩余部分直接链接到新链表末尾。
  4. 空间优化 :直接复用原链表节点,不创建新节点,空间复杂度为 O(1)

代码实现(Java版)

java 复制代码
class Solution {
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        ListNode dummy = new ListNode(0); // 哑节点简化操作
        ListNode cur = dummy;
        
        while (list1 != null && list2 != null) {
            if (list1.val <= list2.val) {
                cur.next = list1;  // 直接复用list1节点
                list1 = list1.next;
            } else {
                cur.next = list2;  // 直接复用list2节点
                list2 = list2.next;
            }
            cur = cur.next;
        }
        
        // 拼接剩余链表
        cur.next = (list1 != null) ? list1 : list2;
        return dummy.next;
    }
}

代码说明

  1. 哑节点(dummy)
  • 初始化一个值为0的节点,其next指向新链表的头节点。
  • 避免处理空链表时的边界条件,使代码更简洁。
  1. 循环比较
  • list1list2均非空时,比较当前节点值。
  • 将较小值节点链接到cur.next,并移动对应链表的指针。
  1. 剩余链表处理
  • 循环结束后,其中一个链表可能还有剩余节点。
  • 通过三元运算符直接将剩余链表链接到新链表末尾。
  1. 返回值
  • dummy.next指向新链表的实际头节点,直接返回即可。

提交详情(执行用时、内存消耗)

相关推荐
汀、人工智能2 分钟前
[特殊字符] 第77课:最长递增子序列
数据结构·算法·数据库架构·图论·bfs·最长递增子序列
网域小星球2 分钟前
C语言从0入门(十)|二维数组详解与矩阵实战
c语言·算法·矩阵·二维数组·数组遍历
澈2078 分钟前
堆排序:高效构建大顶堆实战
数据结构·算法·排序算法
雪的季节21 分钟前
qt信号槽跨线程使用时候的坑
java·开发语言·qt
chh56327 分钟前
C++--内存管理
java·c语言·c++·windows·学习·面试
我真不是小鱼30 分钟前
cpp刷题打卡记录27——无重复字符的最长子串 & 找到字符串中所有字母的异位词
数据结构·c++·算法·leetcode
XuecWu334 分钟前
原生多模态颠覆Scaling Law?解读语言“参数需求型”与视觉“数据需求型”核心差异
人工智能·深度学习·算法·计算机视觉·语言模型
We་ct35 分钟前
LeetCode 69. x 的平方根:两种解法详解
前端·javascript·算法·leetcode·typescript·平方
一直不明飞行37 分钟前
C++:string,写法s.find(‘@‘) != s.end()是否有问题
开发语言·c++·算法
白緢1 小时前
嵌入式 Linux + 内核开发高频问题及排查
java·linux·运维