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

Python类Merge Sort实现两列表交集 第23行报IndexError求助

错误原因与修复方案

报错根因

触发IndexError: list assignment index out of range的直接原因是列表赋值逻辑错误:

  • 你初始化的output是长度为0的空列表,Python中对列表执行list[index] = value赋值时,要求index必须是列表已存在的合法索引,空列表不存在任何有效索引位置,因此第一次执行下标赋值时就会触发越界。
  • 本次运行时流程第一次走到了处理rightList[j]的else分支,所以报错定位到第23行;如果流程第一次走到if分支给leftList[i]赋值,会触发完全相同的越界错误,和取哪个列表的元素无关。

另外你当前实现的逻辑和初始需求存在偏差:你写的「比较两个有序列表当前元素、取较小值存入结果」是归并两个有序列表的逻辑,不是求两个列表交集的逻辑——交集只保留两个列表同时存在的元素,不需要把所有元素都存入结果。

修复方案

根据你的实际需求二选一即可:

方案1:实现归并两个有序列表(匹配你当前写的注释逻辑)

把所有output[k] = xxx的下标赋值替换为output.append(xxx)即可,append方法会自动把元素追加到列表末尾,列表长度自动增长,不需要额外维护k变量记录写入位置,也不会出现索引越界。
修正后代码:

leftList = [int(x) for x in input().split()]
rightList = [int(x) for x in input().split()]
output = []

leftList.sort()
rightList.sort()

i = j = 0

while i < len(leftList) and j < len(rightList):
    if leftList[i] <= rightList[j]:
        output.append(leftList[i])
        i += 1
    else:
        output.append(rightList[j])
        j += 1

# 追加其中一个列表剩余未遍历的元素
while i < len(leftList):
    output.append(leftList[i])
    i += 1
while j < len(rightList):
    output.append(rightList[j])
    j += 1

print(output)

方案2:实现求两个列表交集(匹配你最开始提到的需求)

调整双指针判断逻辑:只有当两个指针指向的元素相等时,才把元素加入结果,同时移动两个指针;元素不等时,只移动指向较小元素的指针(较小值不可能在另一个列表中存在匹配项),不需要往结果中写入值。
修正后代码:

leftList = [int(x) for x in input().split()]
rightList = [int(x) for x in input().split()]
output = []

leftList.sort()
rightList.sort()

i = j = 0

while i < len(leftList) and j < len(rightList):
    if leftList[i] == rightList[j]:
        output.append(leftList[i])
        i += 1
        j += 1
    elif leftList[i] < rightList[j]:
        i += 1
    else:
        j += 1

print(output)

内容的提问来源于stack exchange,提问作者theaveragejoe101

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 20:21:38