C#实现两链表逐元素求和存入新链表的结果异常问题咨询
链表逐元素相加功能异常问题
需求说明
实现两个链表逐元素相加的功能,将计算结果存入全新的链表中。
功能示例
Input : list1 : 5->3->4 list2 : 6->1->2 Output : list3 : 11->4->6
现有实现代码
internal class Program { static void Main(string[] args) { ListNode l1 = new ListNode(1); l1.next = new ListNode(2); l1.next.next = new ListNode(3); ListNode l2 = new ListNode(1); l2.next = new ListNode(2); l2.next.next = new ListNode(3); ListNode l3 = new ListNode(); while (l1 != null && l2 != null) { l3.val += l1.val + l2.val; l1 = l1.next; l2 = l2.next; l3.next = new ListNode(); } while(l3 != null) { Console.WriteLine(l3.val + " ->"); l3 = l3.next; } } public class ListNode { public int val; public ListNode next; public ListNode(int val = 0, ListNode next = null) { this.val = val; this.next = next; } } }
异常现象
代码运行后未达到逐元素求和的预期效果,上述测试用例的实际输出为list3 : 12->0。
异常产生原因
- 核心逻辑错误:计算过程中没有移动结果链表的遍历指针。初始化后
l3始终指向结果链表的头节点,三次循环的求和值(1+1=2、2+2=4、3+3=6)全部累加在头节点的val属性上,最终头节点值为12,和输出的第一个值完全匹配。 - 节点创建逻辑错误:循环中每次都无条件创建新的
l3.next节点,但从未将l3指针指向这个新节点,导致前两次循环创建的节点没有被任何引用持有,直接成为垃圾内存;循环结束后,头节点的next指向最后一次创建的、val取默认值0的空节点,这就是输出第二个值为0的来源。 - 边界逻辑缺失:现有循环没有处理两个链表长度不一致的场景,只要其中一个链表遍历到末尾就会停止计算,会丢失长链表剩余节点的值;同时输出时直接移动了结果链表的头指针本身,没有提前保存头节点引用,会导致后续无法再从头遍历结果链表。
内容的提问来源于stack exchange,提问作者Andrei Popa
相关产品推荐
相关产品推荐

