ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

LeetCode:题目解答复盘(6)

LeetCode:题目解答复盘(6) 第一部分206. 反转链表题目描述给你单链表的头节点 head请你反转链表并返回反转后的链表。示例1 - 2 - 3 - 4 - 5 变为 5 - 4 - 3 - 2 - 1解题思路迭代双指针反转链表的核心在于改变指针的指向。我们可以使用两个指针pre指向前一个节点初始为 nullptr因为反转后原头节点将变成尾节点指向空。curr指向当前正在处理的节点初始为 head。由于单向链表无法逆向访问在改变 curr-next 指向之前必须先用一个临时指针 nextTemp 保存原本的下一个节点否则后面的链表就会丢失。解题步骤初始化定义 pre nullptrcurr head。遍历链表当 curr 不为空时执行循环存记录下一个节点 nextTemp curr-next。改将当前节点的 next 指向 precurr-next pre。移将 pre 移动到 curr 的位置将 curr 移动到 nextTemp 的位置。返回结果循环结束时curr 指向空pre 恰好指向原链表的最后一个节点也就是反转后的新头节点返回 pre。注意事项指针丢失一定要先保存 nextTemp再去修改 curr-next。循环终止条件是 curr ! nullptr不能写成 curr-next ! nullptr否则最后一个节点无法处理。返回值返回的是 pre 而不是 head。第二部分160. 相交链表题目描述给你两个单链表的头节点 headA 和 headB请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点返回 null。解题思路双指针消除长度差如果两个链表相交那么它们从相交节点到尾部的长度是相同的。但因为头节点到相交节点的距离不同假设 A 独有部分长 aB 独有部分长 b公共部分长 c如果两个指针同时出发步调一致是无法同时到达相交节点的。巧妙的解法让指针 pa 走完链表 A 后去走链表 B指针 pb 走完链表 B 后去走链表 A。pa 走过的总路程a c bpb 走过的总路程b c a因为 a c b b c a所以如果它们相交必定会在交点相遇如果不相交它们会同时走到 nullptr。解题步骤边界判断如果 headA 或 headB 为空直接返回 nullptr。初始化定义 pa headApb headB。循环遍历当 pa ! pb 时执行循环如果 pa nullptr让它跳到 headB否则 pa pa-next。如果 pb nullptr让它跳到 headA否则 pb pb-next。返回结果循环结束时pa 和 pb 要么指向相交节点要么同时为 nullptr不相交返回 pa 即可。注意事项血泪教训 与 的区别在写 if 判断时千万不能把 写成 if (pa NULL) 会把 NULL 赋值给 pa导致 pa 变成空指针紧接着执行 pa pa-next 就会引发空指针解引用Runtime Error。建议写成 if (nullptr pa)这样万一漏写等号编译器会直接报错避免隐藏的逻辑 bug你第一张截图中的红线就是这个原因。保持原结构题目要求返回结果后链表必须保持其原始结构。双指针法只改变指针的走向不会破坏原链表结构符合要求。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进