跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C算法

链表面试基础:快慢指针与哨兵节点的实战应用

链表是数据结构面试中的高频考点。针对中间结点查找与有序链表合并问题,分别采用快慢指针与哨兵节点策略优化解法。前者避免二次遍历,后者简化边界判断。代码基于 C 语言实现,注重内存管理与逻辑清晰性,适合初学者夯实基础并应对面试场景。

FrontendX发布于 2026/3/15更新于 2026/7/2027 浏览
链表面试基础:快慢指针与哨兵节点的实战应用

链表是数据结构面试中的高频考点。掌握核心技巧往往比死记硬背代码更重要,本文通过两个经典题目解析关键思路。

876. 链表的中间结点

寻找中间结点看似简单,但边界情况容易出错。常规思路是先遍历一次统计长度,算出 mid 后再移动指针。这种方法需要两次扫描,效率略低。

更优雅的做法是使用快慢指针。让慢指针每次走一步,快指针每次走两步。当快指针到达尾部时,慢指针自然指向中间位置。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
typedef struct ListNode ListNode;
struct ListNode* middleNode(struct ListNode* head) {
    // 创建快慢指针,初始都指向头节点
    ListNode* fast = head;
    ListNode* slow = head;
    
    // 循环条件需同时满足:fast 不为空且 fast->next 不为空
    // 这样能兼容奇数和偶数长度的链表
    while(fast != NULL && fast->next != NULL) {
        slow = slow->next;       // 慢指针移动一节点
        fast = fast->next->next; // 快指针移动两节点
    }
    return slow;
}

为什么这么写? 找中点时,关注的是慢指针的位置。快指针速度是慢指针的两倍,当它走到尾或空时,慢指针刚好走了半程。循环条件用'且'而非'或',是因为只有当 fast 和 next 都存在时,才能安全执行 fast->next->next,避免空指针解引用。

21. 合并两个有序链表

合并两个有序链表时,直接比较大小并尾插新节点是直观做法,但需要处理大量空指针判断,代码冗余较多。

引入'哨兵节点'可以简化逻辑。哨兵节点是一个不存储有效数据的临时头节点,它的 next 指针最终指向真正的头节点。使用哨兵后,无需在循环内判断是否为第一次插入,统一进行尾插操作即可。

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
    // 处理空链表边界
    if(list1 == NULL) return list2;
    if(list2 == NULL) return list1;
    
    // 申请哨兵节点空间
    ListNode* newhead = (ListNode*)((ListNode));
    ListNode* newtail = newhead;
    
    ListNode* l1 = list1;
    ListNode* l2 = list2;
    
    
    (l1 !=  && l2 != ) {
        (l1->val < l2->val) {
            newtail->next = l1;
            newtail = newtail->next;
            l1 = l1->next;
        }  {
            newtail->next = l2;
            newtail = newtail->next;
            l2 = l2->next;
        }
    }
    
    
    (l1) newtail->next = l1;
    (l2) newtail->next = l2;
    
    
    ListNode* retnewhead = newhead->next;
    (newhead);
     retnewhead;
}
malloc
sizeof
// 双指针遍历比较
while
NULL
NULL
if
else
// 将剩余非空链表直接接在尾部
if
if
// 保存结果头节点并释放哨兵
free
return

关键点说明:

  1. 哨兵的作用:消除了对 newhead 是否为空的判断,统一了插入逻辑。
  2. 内存管理:哨兵节点是动态申请的,最后必须释放,防止内存泄漏。
  3. 返回值:返回的是 newhead->next,因为哨兵本身不是数据节点。

掌握这两个技巧,不仅能解决当前问题,也为后续攻克双向链表、复杂指针操作打下坚实基础。刷题重在理解背后的设计思想,积跬步以致千里。

目录

  1. 876. 链表的中间结点
  2. 21. 合并两个有序链表
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • LangChain 与智能 Agent:AI 助手构建实战
  • 基于腾讯云 HAI 与 DeepSeek 快速搭建个人网页
  • C++ 手写线程池日志模块:基于策略模式实现
  • GitHub 仓库上传、更新与维护指南
  • DooTask 升级指南:新增 AI 助手与协作功能
  • 绿联 NAS 配置 WebDAV 公网访问并使用 RaiDrive 挂载到本地
  • 基于 Cogito-v1-preview-llama-3B 的汽车电子 ECU 诊断逻辑建模实践
  • 国产 AI 编码工具深度测评:核心能力与局限分析
  • 算法:快慢指针判断快乐数
  • 前端实战:使用 Three.js 实现动态星空粒子效果
  • 全球老龄化背景下的护理机器人技术发展与挑战
  • 马尔可夫决策过程
  • 基于 FastGPT 与 MCP 协议构建工具增强型智能体
  • 基于 Python 与 AI 的智能害虫识别系统实战
  • 数据结构核心:链表(单链表、双链表及循环链表)
  • 基于 Go 的电子病历智能助手与 HIS 对接实战
  • C++ 面向对象编程:继承机制深度解析
  • 无人机路径规划算法详解
  • 汽车雷达多径场景下的幽灵目标检测技术解析
  • 利用 KSWEB 在安卓手机部署 Typecho 博客及内网穿透方案

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online