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;
}
相关推荐
那个村的李富贵8 小时前
CANN加速下的AIGC“即时翻译”:AI语音克隆与实时变声实战
人工智能·算法·aigc·cann
power 雀儿9 小时前
Scaled Dot-Product Attention 分数计算 C++
算法
Yvonne爱编码9 小时前
JAVA数据结构 DAY6-栈和队列
java·开发语言·数据结构·python
熬夜有啥好9 小时前
数据结构——哈希表
数据结构·散列表
琹箐9 小时前
最大堆和最小堆 实现思路
java·开发语言·算法
renhongxia110 小时前
如何基于知识图谱进行故障原因、事故原因推理,需要用到哪些算法
人工智能·深度学习·算法·机器学习·自然语言处理·transformer·知识图谱
坚持就完事了10 小时前
数据结构之树(Java实现)
java·算法
算法备案代理10 小时前
大模型备案与算法备案,企业该如何选择?
人工智能·算法·大模型·算法备案
赛姐在努力.10 小时前
【拓扑排序】-- 算法原理讲解,及实现拓扑排序,附赠热门例题
java·算法·图论
我能坚持多久10 小时前
【初阶数据结构01】——顺序表专题
数据结构