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

如何同时遍历两个LinkedList?现有代码报错求解决方案

问题分析与解决方案

报错原因

  1. 参数类型不匹配:你传入的是普通数组,但代码逻辑默认l1、l2是带next属性的链表节点对象,数组没有next属性,执行l2 = l2.next时自然会报错。
  2. 遍历逻辑有缺陷:现有循环只以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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 09:12:14