28.两数相加,进位制

1.题目描述

2.思路

  • 初始化基础结构 :创建虚拟头节点 dummy(用于简化尾插法边界处理)和尾指针 tail(指向结果链表最后一个节点),初始化进位变量 carry 为 0(存储逐位相加的进位值)。
  • 处理两个链表的共同节点 :遍历 l1l2 均不为空的节点,取出两节点值加上进位计算总和 sum;若 sum≥10 则更新进位为 1 并取 sum%10 作为当前位值,否则进位置 0;创建新节点存储当前位值,通过尾插法接入结果链表,同时移动 l1l2 指针。
  • 处理链表的剩余节点 :若 l1 为空但 l2 有剩余,用 0 补齐 l1 的值继续与 l2 剩余节点相加;若 l2 为空但 l1 有剩余,用 0 补齐 l2 的值继续与 l1 剩余节点相加,计算逻辑与步骤 2 一致,完成剩余节点的逐位相加和尾插。
  • 处理最终进位并返回结果 :若所有节点遍历完成后仍有进位(carry=1),创建新节点存储该进位并尾插;最后返回虚拟头节点的下一个节点(即结果链表的真实头节点)。

3.代码

cpp 复制代码
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
  
    //创建一个新的虚拟头节点
    struct ListNode *dummy = (struct ListNode*)malloc(sizeof(struct ListNode));
    dummy->val = 0;    // 虚拟头节点的值无意义
    dummy->next = NULL;
    
    // 尾指针:始终指向结果链表的最后一个节点,用于尾插新节点
    struct ListNode *tail = dummy;

    //首先就是从个位开始加,刚好链表是你序列存储,不然还要反转
    //逐位相加,进位只可能是1,比如加起来等于16,保存16%10,进位就是16/10
   
    int carry = 0;//保存当前轮次的进位
    while(l1 != NULL && l2 != NULL){
        int val1 = l1->val;
        int val2 = l2->val;

        int sum =val1 + val2 + carry;
        if(sum >=10){
            carry = 1;//留给下一轮的
            sum = sum % 10;
        }else{
            carry = 0;
        }
        //此时sum就是第i个节点的最终值
        struct ListNode *newnode = (struct ListNode*)malloc(sizeof(struct ListNode));//新节点创建
        newnode->val = sum;
        newnode->next = NULL;
        tail->next = newnode;
        tail = tail->next;
        l1 = l1 ->next;
        l2 = l2->next;
    }
   if(l1==NULL&&l2!=NULL){
    int val1 = 0;
    while(l2!=NULL){
        int val2 = l2->val;
        int sum = val1 + val2 + carry;
        if(sum >= 10){
            carry = 1;
            sum = sum % 10;
        }else{carry = 0;}
        struct ListNode *newnode = (struct ListNode*)malloc(sizeof(struct ListNode));//新节点创建
        newnode->val = sum;
        newnode->next = NULL;
        tail->next = newnode;
        tail = tail->next;
         l2 = l2->next;
    }
   }
   if(l2==NULL&&l1!=NULL){
    int val2 = 0;
    while(l1!=NULL){
        int val1 = l1 ->val;
        int sum = val1 + val2 + carry;
        if(sum >= 10){
            carry = 1;
            sum = sum % 10;
        }else{carry=0;}
        struct ListNode *newnode = (struct ListNode*)malloc(sizeof(struct ListNode));//新节点创建
        newnode->val = sum;
        newnode->next = NULL;
        tail->next = newnode;
        tail = tail->next;
         l1 = l1->next;
       }
    }
    if(carry == 1){
        struct ListNode *newnode = (struct ListNode*)malloc(sizeof(struct ListNode));
        newnode->val = carry;    // 进位只能是1,直接赋值
        newnode->next = NULL;
        tail->next = newnode;
        tail = tail->next;
    }

   return dummy->next;
}
相关推荐
mCell4 小时前
Lua 编程入门:从基础语法到元表
javascript·算法·lua
wuyk5556 小时前
98.C语言易混难点:字符数组与字符串指针的底层差异
c语言·开发语言·c++·stm32·嵌入式硬件·算法
峥无7 小时前
从0到1手撕红黑树:封装实现 my_map 与 my_set(SGI-STL 源码级深度解析)
开发语言·c++·笔记·算法·stl
不会代码的小猴7 小时前
3. 控件学习1
开发语言·c++·笔记·qt·算法
疯狂打码的少年9 小时前
【数据结构】图的存储结构:邻接矩阵与邻接表
数据结构·笔记
203号居民9 小时前
LeetCode hot 100 —41. 缺失的第一个正数
数据结构·算法·leetcode
专注仿真11 小时前
问答大模型技术方案算法实现-熵权法融合算法 + 交叉编码器重排算法
人工智能·python·算法·语言模型·问答大模型关键算法·熵权融合算法·交叉编码器重排算法
地平线开发者12 小时前
量化为什么会有损失:从量化误差到精度下降
算法
手写码匠13 小时前
华为云Flexus+DeepSeek征文|Dify 多 Agent 会话管理与上下文工程实战:让智能体“记住该记住的,忘掉该忘掉的“
人工智能·深度学习·算法·aigc