当前位置: 首页 > article >正文

LeetCode【0021】合并两个有序链表

本文目录

  • 1 中文题目
  • 2 求解方法: 双指针+虚拟头节点
    • 2.1 方法思路
    • 2.2 Python代码
    • 2.3 复杂度分析
  • 3 题目总结

1 中文题目

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

示例:
在这里插入图片描述

链表如上
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
输入:l1 = [], l2 = []
输出:[]
输入:l1 = [], l2 = [0]
输出:[0]

提示:

  • 两个链表的节点数目范围是 [0, 50]
  • − 100 ≤ N o d e . v a l ≤ 100 -100 \leq Node.val \leq 100 100Node.val100
  • l1l2 均按 非递减顺序 排列

2 求解方法: 双指针+虚拟头节点

2.1 方法思路

方法核心

  • 使用虚拟头节点简化边界情况处理
  • 采用双指针遍历两个链表并比较节点值
  • 直接利用原有节点进行链接,不创建新节点

实现步骤

(1)初始化阶段:

  • 创建虚拟头节点
  • 初始化当前指针current

(2)合并主循环:

  • 比较两个链表当前节点值
  • 选择较小值的节点连接到新链表
  • 移动对应链表的指针

(3)处理剩余节点:

  • 检查是否有剩余节点
  • 将剩余节点直接连接到结果链表

(4)返回结果:

  • 返回虚拟头节点的next

方法示例

输入:list1 = [1,2,4], list2 = [1,3,4]

步骤演示:
1. 初始状态:
dummy -> NULL
current = dummy
list1: 1 -> 2 -> 4
list2: 1 -> 3 -> 4

2. 第一次比较(1 vs 1):
dummy -> 1
current
list1: 2 -> 4
list2: 1 -> 3 -> 4

3. 第二次比较(2 vs 1):
dummy -> 1 -> 1
           current
list1: 2 -> 4
list2: 3 -> 4

4. 第三次比较(2 vs 3):
dummy -> 1 -> 1 -> 2
                current
list1: 4
list2: 3 -> 4

5. 第四次比较(4 vs 3):
dummy -> 1 -> 1 -> 2 -> 3
                     current
list1: 4
list2: 4

6. 第五次比较(4 vs 4):
dummy -> 1 -> 1 -> 2 -> 3 -> 4
                          current
list1: NULL
list2: 4

7. 处理剩余节点:
dummy -> 1 -> 1 -> 2 -> 3 -> 4 -> 4
                               current

8. 最终返回:
1 -> 1 -> 2 -> 3 -> 4 -> 4

2.2 Python代码

class Solution:
    def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
        # 创建虚拟头节点,简化边界情况处理
        dummy = ListNode(0)
        # 当前节点指针,用于构建新链表
        current = dummy
        
        # 当两个链表都不为空时,比较节点值并连接
        while list1 and list2:
            # 如果list1当前节点值较小
            if list1.val <= list2.val:
                # 将current的next指向list1当前节点
                current.next = list1
                # list1指针后移
                list1 = list1.next
            # 如果list2当前节点值较小
            else:
                # 将current的next指向list2当前节点
                current.next = list2
                # list2指针后移
                list2 = list2.next
            # current指针后移,准备下一次连接
            current = current.next
        
        # 处理剩余节点
        # 如果list1还有剩余,直接接在current后面
        if list1:
            current.next = list1
        # 如果list2还有剩余,直接接在current后面
        if list2:
            current.next = list2
        
        # 返回真实的头节点
        return dummy.next

2.3 复杂度分析

  • 时间复杂度:O(n + m),n 是 list1 的长度,m 是 list2 的长度
    • 每个节点只被访问一次
  • 空间复杂度:O(1)
    • 只使用了虚拟头节点和current指针
    • 没有创建新的节点
    • 直接利用原有节点进行链接

3 题目总结

题目难度:简单
数据结构:链表
应用算法:双指针


http://www.kler.cn/a/392617.html

相关文章:

  • 2024-11-13 学习人工智能的Day26 sklearn(2)
  • golang如何实现sse
  • [CKS] K8S NetworkPolicy Set Up
  • 图片画廊 day2 (可复制源码)
  • C/C++精品项目之图床共享云存储(3):网络缓冲区类和main
  • 系统架构设计师论文
  • HBuilder(uniapp) 配置android模拟器
  • php回调函数(匿名)的使用
  • IC 脚本之VIM 记录
  • 构建高效在线商店:Spring Boot框架应用
  • three.js 杂记
  • mysql 常用命令(二)
  • ROS1 Noetic编程环境搭建和练习
  • aws-athena查询语句总结
  • 视频播放相关的杂记
  • ChromeDriver 官方下载地址_测试自动化浏览器驱动
  • FreeRTOS源码(二) 任务调度
  • 数据湖与数据仓库的区别
  • Hive1.2.1与Hbase1.4.13集成---版本不兼容问题
  • 人工智能机器学习-特征工程
  • filezilla连接虚拟机Ubuntu Linux时无法连接到服务器的解决方案
  • HTML之列表学习记录
  • 研发工程师---物联网+AI方向
  • 实测运行容器化Tomcat服务器
  • 数据集整理分类小工具
  • Llama架构及代码详解