如何同时遍历两个LinkedList?现有代码报错求解决方案
问题分析与解决方案
报错原因
- 参数类型不匹配:你传入的是普通数组,但代码逻辑默认
l1、l2是带next属性的链表节点对象,数组没有next属性,执行l2 = l2.next时自然会报错。 - 遍历逻辑有缺陷:现有循环只以
l1是否存在为终止条件,若l2比l1短,会出现l2已为null仍访问next的情况;若l2更长,l1遍历结束后l2的剩余节点会被忽略。
同步遍历双链表的实现
要实现无论链表长度是否相等都能同步遍历,只需把循环条件改为l1 || l2(只要其中一个链表还有节点就继续),每次循环内分别判断当前节点是否存在再处理即可。
首先明确标准链表节点结构,并添加数组转链表的辅助函数(方便用你的数组参数测试):
// 链表节点构造函数 function ListNode(val, next = null) { this.val = val; this.next = next; } // 辅助函数:将数组转换为链表 function arrayToList(arr) { let dummy = new ListNode(0); let current = dummy; for (const val of arr) { current.next = new ListNode(val); current = current.next; } return dummy.next; }
然后修改遍历函数:
const loopTwoList = function (l1, l2) { // 只要任一链表还有未遍历节点,循环继续 while (l1 || l2) { // 处理l1当前节点(存在时) if (l1) { const tmp1 = l1; l1 = l1.next; tmp1.next = null; // 这里可添加对当前节点的业务操作,比如打印值 console.log('处理l1节点:', tmp1.val); } // 处理l2当前节点(存在时) if (l2) { const tmp2 = l2; l2 = l2.next; tmp2.next = null; // 这里可添加对当前节点的业务操作,比如打印值 console.log('处理l2节点:', tmp2.val); } } }; // 先将数组转为链表再传入 const l1 = arrayToList([2,4,3]); const l2 = arrayToList([5,6,4]); loopTwoList(l1, l2);
逻辑说明
- 循环条件
l1 || l2确保两个链表的所有节点都会被遍历到,不管长度差异。 - 每次循环内分别判断节点是否存在,避免了访问
null的next属性引发报错。 - 若其中一个链表先遍历完成,后续循环只会处理另一个链表的剩余节点,完全满足你“同步遍历”的需求。
内容的提问来源于stack exchange,提问作者Bugra Kucuk
相关产品推荐
相关产品推荐

