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;
}
相关推荐
想要成为糕糕手7 分钟前
前端必修课:JavaScript 数组与数据结构底层逻辑全解析
javascript·数据结构·面试
KaMeidebaby20 分钟前
卡梅德生物技术快报|纯化重组蛋白实操详解
人工智能·python·tcp/ip·算法·机器学习
手写码匠1 小时前
从零实现 Prompt 工程引擎:结构化提示、自动优化与多轮自省体系
人工智能·深度学习·算法·aigc
无限码力2 小时前
阿里算法岗 0530笔试真题 - 多约束条件下的元素匹配统计
算法·阿里笔试真题·阿里机试真题·阿里算法岗笔试
lqqjuly2 小时前
MLA — 多头潜在注意力深度解析
深度学习·神经网络·算法
吴可可1232 小时前
SolidWorks草图转三维DWG技巧
算法
tyung2 小时前
Go 手写 Wait-Free SPSC 无界队列:无 CAS、无锁、泛型节点池
数据结构·后端·go
redaijufeng3 小时前
C++雾中风景7:闭包
c++·算法·风景
Chen_harmony3 小时前
一、数据结构概念和复杂度计算
数据结构
小欣加油3 小时前
leetcode287寻找重复数
数据结构·c++·算法·leetcode