基于ListNode的两数相加问题:循环执行两次却仅生成一个节点?
问题原因分析
你遇到的这个问题,核心原因是构建结果链表时,没有正确维护节点间的引用关系,导致第二次循环生成的节点没有被链接到结果链表中,或者两次循环都修改了同一个节点的值。结合你描述的“循环运行两次但仅生成一个节点”的现象,最常见的两种错误场景如下:
场景1:循环中仅修改当前节点的值,未创建新节点
如果你的代码类似下面这样,就会出现该问题:
public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode l3 = new ListNode(0); ListNode current = l3; int carry = 0; while (l1 != null || l2 != null) { int sum = carry; if (l1 != null) { sum += l1.val; l1 = l1.next; } if (l2 != null) { sum += l2.val; l2 = l2.next; } carry = sum / 10; // 错误:每次循环都修改同一个current节点的值,未创建新节点 current.val = sum % 10; // 仅在l1/l2还有后续节点时才创建next,第二次循环后l1/l2都为null,不会创建next if (l1 != null || l2 != null) { current.next = new ListNode(0); current = current.next; } } return l3; }
- 第一次循环:
current指向l3,将其值设为2,因l1和l2还有下一个节点,创建current.next并移动current到该节点。 - 第二次循环:计算sum仍为2,修改当前
current节点的值为2,但此时l1和l2都已为null,不会创建新的next节点。但如果测试时仅检查l3本身而未遍历整个链表,就会误以为只生成了一个节点;或者代码逻辑错误,导致后续节点未被正确保留。
场景2:结果链表的引用未正确维护,新节点未链接到主链表
这是更可能出现的错误场景,代码类似如下:
public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode l3 = null; ListNode current = null; int carry = 0; while (l1 != null || l2 != null) { int sum = carry; if (l1 != null) { sum += l1.val; l1 = l1.next; } if (l2 != null) { sum += l2.val; l2 = l2.next; } carry = sum / 10; ListNode newNode = new ListNode(sum % 10); if (l3 == null) { l3 = newNode; current = newNode; } else { // 错误:未将current的next指向新节点,仅覆盖current引用 current = newNode; } } return l3; }
- 第一次循环:
l3被赋值为第一个值为2的节点,current也指向该节点。 - 第二次循环:创建了第二个值为2的节点,但仅将
current指向新节点,未把原current(第一个节点)的next指向新节点。最终l3仍只指向第一个节点,第二个节点成为孤立节点,导致结果链表仅显示一个节点。
关键总结
本质问题是没有正确维护结果链表的节点引用链:要么没有为第二次循环的结果创建新节点并链接到前一个节点,要么创建了新节点但未将其加入主链表的引用链中。循环运行两次说明求和逻辑都执行了,但节点间的链接关系出错,导致最终返回的链表只包含第一个节点。
内容的提问来源于stack exchange,提问作者SBM
相关产品推荐
相关产品推荐

