【中等】题解力扣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指向新链表的实际头节点,直接返回即可。

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

相关推荐
tankeven7 小时前
HJ139 小红的01子序列计数(hard)
c++·算法
weixin_649555677 小时前
C语言程序设计第四版(何钦铭、颜晖)第十章函数与程序设计之汉诺塔问题
c语言·c++·算法
C羊驼7 小时前
C语言:随机数
c语言·开发语言·经验分享·笔记·算法
weisian1517 小时前
Java并发编程--17-阻塞队列BlockingQueue:生产者-消费者模式的最佳实践
java·阻塞队列·blockqueue
奔跑的呱呱牛7 小时前
GeoJSON 在大数据场景下为什么不够用?替代方案分析
java·大数据·servlet·gis·geojson
爱丽_7 小时前
Pinia 状态管理:模块化、持久化与“权限联动”落地
java·前端·spring
xushichao19897 小时前
实时数据压缩库
开发语言·c++·算法
minji...7 小时前
Linux 文件系统 (三) 软连接和硬链接
linux·运维·服务器·c++·算法
故事和你917 小时前
sdut-python-实验四-python序列结构(21-27)
大数据·开发语言·数据结构·python·算法
memcpy07 小时前
LeetCode 1456. 定长子串中元音的最大数目【定长滑窗模板题】中等
算法·leetcode·职场和发展