相交链表问题:双指针切换链表的实现代码为何无法运行?
链表相交节点查找代码问题分析
我的实现思路
- 为两个链表各设置一个指针节点,分别指向对应链表的头节点。
- 遍历这两个节点,若其中一个节点变为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; }
代码错误分析
循环条件阻断了指针切换逻辑
你的while循环条件是d1 != NULL && d2 != NULL,这意味着只要其中一个指针走到null,循环就直接终止,根本没机会执行后面的指针切换代码(把null指针指向另一个链表头)。比如当d1遍历完l1变为null时,循环条件不满足,直接跳出返回null,完全触发不了d1 = l2的逻辑。指针切换逻辑完全无效
因为循环条件已经保证了d1和d2都不为null,所以循环里的两个if(d1 == NULL)判断永远不会成立,等于白写。另外,就算指针真的变成null,后续执行d1 = d1->next还会直接触发空指针异常。边界场景处理有漏洞
初始判断只处理了两个链表都为空的情况,但如果其中一个链表为空、另一个不为空,当前代码直接在循环外返回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
相关产品推荐
相关产品推荐

