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

链表相加程序仅返回单个元素,预期至少3个元素的问题排查

问题排查与修复

你的代码核心问题出在链表构建逻辑和相加函数的剩余节点处理上,以下是具体分析和修复方案:

1. main函数中链表构建的错误

你在创建l1和l2时,只成功生成了第一个节点,后续节点既没有被正确创建,也没有接入链表:

  • 以l1为例,for循环里的if(!t1)仅在i=1时执行一次(创建第二个节点),但这个节点没有被连接到l1的链表尾部;当i=2时,t1已经不为空,不会创建第三个节点。
  • 打印逻辑也有问题,你只是打印了t1的val,而不是遍历整个链表,导致你误以为链表已经正确构建。

修正后的链表构建代码

// 构建l1链表
struct ListNode *tail;
l1 = (struct ListNode*)malloc(sizeof(struct ListNode));
l1->val = l1i[0];
l1->next = NULL;
tail = l1;
printf("%d\t", l1->val);
for (int i = 1; i < 3; i++)
{
    struct ListNode *new_node = (struct ListNode*)malloc(sizeof(struct ListNode));
    new_node->val = l1i[i];
    new_node->next = NULL;
    tail->next = new_node;
    tail = new_node;
    printf("%d\t", new_node->val);
}
printf("\n");

// 构建l2链表同理
l2 = (struct ListNode*)malloc(sizeof(struct ListNode));
l2->val = l2i[0];
l2->next = NULL;
tail = l2;
printf("%d\t", l2->val);
for (int i = 1; i < 3; i++)
{
    struct ListNode *new_node = (struct ListNode*)malloc(sizeof(struct ListNode));
    new_node->val = l2i[i];
    new_node->next = NULL;
    tail->next = new_node;
    tail = new_node;
    printf("%d\t", new_node->val);
}
printf("\n");

2. addTwoNumbers函数的逻辑缺陷

  • 剩余节点处理错误:当其中一个链表遍历完后,处理剩余节点时,你直接修改t3的val,但t3是结果链表的最后一个节点,随后t3 = t3->next会让t3变为NULL,后续节点无法添加。正确做法是创建新节点,接到t3尾部。
  • 未处理最终进位:如果最后一次相加产生进位(比如999+999=1998),需要额外添加一个存储进位的节点。

修正后的addTwoNumbers函数

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    struct ListNode *t1 = l1, *t2 = l2;
    struct ListNode *result = NULL, *t3 = NULL;
    int carry = 0;

    while (t1 != NULL || t2 != NULL || carry != 0)
    {
        int sum = carry;
        if (t1 != NULL) {
            sum += t1->val;
            t1 = t1->next;
        }
        if (t2 != NULL) {
            sum += t2->val;
            t2 = t2->next;
        }
        carry = sum / 10;

        struct ListNode *temp = (struct ListNode*)malloc(sizeof(struct ListNode));
        temp->val = sum % 10;
        temp->next = NULL;

        if (result == NULL) {
            result = temp;
            t3 = result;
        } else {
            t3->next = temp;
            t3 = temp;
        }
    }
    return result;
}

这个修正后的函数用一个循环处理所有情况:包括两个链表都有节点、其中一个链表剩余节点、还有最后的进位,逻辑更简洁健壮。

最终运行结果

修正后,程序会输出:

2       4       3       
5       6       4       
7       0       8       

符合预期(243+564=807,链表是逆序存储,所以结果是7->0->8)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 16:37:54