You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

相交链表问题:双指针切换链表的实现代码为何无法运行?

链表相交节点查找代码问题分析

我的实现思路

  • 为两个链表各设置一个指针节点,分别指向对应链表的头节点。
  • 遍历这两个节点,若其中一个节点变为null,则将其指向另一个链表的头节点,继续遍历直至两者相遇。

问题

请问为何以下代码无法正常运行?

ListNode *getIntersectionNode(ListNode *l1, ListNode *l2) {
        if(l1 == NULL && l2 == NULL) return NULL;
        ListNode* d1 = l1;
        ListNode* d2 = l2;
        while(d1 != NULL && d2 != NULL) {
            if(d1 == d2) {
                return d1;
            }
            if(d1 == NULL && d2 != NULL) d1 = l2;
            if(d2 == NULL && d1 != NULL) d2 = l1;
            d1 = d1 -> next;
            d2 = d2 -> next;
        }
        return NULL;
    }

代码错误分析

  1. 循环条件阻断了指针切换逻辑
    你的while循环条件是d1 != NULL && d2 != NULL,这意味着只要其中一个指针走到null,循环就直接终止,根本没机会执行后面的指针切换代码(把null指针指向另一个链表头)。比如当d1遍历完l1变为null时,循环条件不满足,直接跳出返回null,完全触发不了d1 = l2的逻辑。

  2. 指针切换逻辑完全无效
    因为循环条件已经保证了d1和d2都不为null,所以循环里的两个if(d1 == NULL)判断永远不会成立,等于白写。另外,就算指针真的变成null,后续执行d1 = d1->next还会直接触发空指针异常。

  3. 边界场景处理有漏洞
    初始判断只处理了两个链表都为空的情况,但如果其中一个链表为空、另一个不为空,当前代码直接在循环外返回null(虽然这种情况确实没有交点,但逻辑上可以和正常流程合并,不需要单独判断)。

修正后的代码

正确的逻辑应该是让指针遍历完自身链表后,直接切换到另一个链表的头,直到两者相遇,不需要限制循环条件为双指针非空:

ListNode *getIntersectionNode(ListNode *l1, ListNode *l2) {
    if (l1 == nullptr || l2 == nullptr) return nullptr;
    ListNode* d1 = l1;
    ListNode* d2 = l2;
    
    while (d1 != d2) {
        // d1走到末尾就切换到l2,否则继续遍历下一个节点
        d1 = (d1 == nullptr) ? l2 : d1->next;
        // d2同理处理
        d2 = (d2 == nullptr) ? l1 : d2->next;
    }
    
    // 相遇时要么是交点,要么都是null(无交点)
    return d1;
}

内容的提问来源于stack exchange,提问作者Dev Gupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 19:39:57