1. 链表相交问题解析与实现
1.1 问题本质理解
链表相交问题的核心在于判断两个链表是否共享某些节点,而不仅仅是节点值相同。很多初学者容易混淆"节点值相等"和"节点相同"这两个概念。实际上,题目要求的是内存地址相同的节点,即两个链表在某个节点开始完全重合(后续节点自然也相同)。
举个例子,假设链表A:1→2→8→9→10,链表B:4→5→8→9→10。这里的交点不是值为1的节点(虽然两个链表都有值为1的节点),而是值为8的节点,因为从这个节点开始,两个链表后续的节点完全一致(内存地址相同)。
1.2 双指针解法详解
我采用的解法是经典的"对齐末尾法",具体步骤如下:
- 遍历两个链表,分别计算它们的长度lenA和lenB
- 重新定位到两个链表的头部
- 让较长的链表的指针先移动|lenA-lenB|步,使两个指针剩余可遍历的节点数相同
- 然后两个指针同步移动,比较每次移动后的节点是否相同
这个方法的巧妙之处在于它消除了两个链表的长度差异,使得我们可以同步比较节点。时间复杂度是O(m+n),空间复杂度是O(1),是最优解之一。
注意:在实现时,我使用了swap函数来统一处理,确保currentA始终指向较长的链表,这样可以减少条件判断,使代码更简洁。
1.3 边界条件处理
在实际编码中,有几个边界条件需要特别注意:
- 空链表处理:如果其中一个链表为空,直接返回null
- 不相交情况:当遍历到链表末尾仍未找到相同节点,返回null
- 相同长度链表:此时不需要移动指针,直接同步比较即可
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环形链表II问题深度剖析
2.1 判断链表是否有环
判断链表是否有环是解决这个问题的基础。我使用了快慢指针法(Floyd判圈算法):
- 快指针(fast)每次移动两步
- 慢指针(slow)每次移动一步
- 如果链表有环,快慢指针必定会相遇
这个方法的原理很简单:如果有环,快指针会先进入环,慢指针后进入环。由于快指针每次比慢指针多走一步,它们最终必定会在环内相遇。
关键点:循环条件必须是
fast!=NULL && fast->next!=NULL,这个顺序不能颠倒。如果反过来写,当fast为NULL时,访问fast->next会导致段错误。
