本题为leetcode上的一道中等难度题,源代码由一名叫做秀艺的用户所写,相比我自己的版本简洁很多,应用了很多小技巧,值得借鉴学习,在整理过程中为了更好的理清思路,为每一行代码进行了注释(这样做效果也确实不错)。


题目如下:

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

算法思想:

思想比较简单,即进行逐位相加,在设置一个变量作为进位位。

需要注意的是最后一位的相加进位的处理和两链表长度不同时的处理。

另外还有一种方法是靠递归来完成。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){//用于存储当前节点值的中间变量int x, y;//用于存储当前计算结果int num;//用于存储进位int flag = 0;//用于代替l1,l2进行运算struct ListNode *p = l1, *q = l2;//用于存储计算结果,只所以在此处就进行创建,是为了方便返回结果链表的头部地址,是一个标记位置struct ListNode *cur = (struct ListNode*)malloc(sizeof(struct ListNode));//初始化其指针,防止其任意指向一个随机地址cur -> next = NULL;//用于输出结果struct ListNode *ret = cur;while(p!=NULL || q!=NULL){//判断链表是否到头,到头则用0代替,继续参与运算x = (p != NULL) ? p->val:0;y = (q != NULL) ? q->val:0;//存储目前位数所得结果num = x + y + flag;//通过除来得到是否进位(整型相除只会保存整数结果,小数舍弃)flag = num / 10;//生成真正用于存储的节点,cur -> next = (struct ListNode*)malloc(sizeof(struct ListNode));//定位到存储节点cur = cur -> next;//通过模运算获得计算结果的个位部分,这样做便不需要为了判断结果而写额外的判断语句cur -> val = num % 10;//初始化其指针,防止其任意指向一个地址cur -> next = NULL;//判断两个原链表是否到头,未到头则移动到下一位置if(p != NULL)p = p -> next;if(q != NULL)q = q -> next;}//判断最后一位相加后是否还有进位if(flag > 0){//生成存储节点cur -> next = (struct ListNode*)malloc(sizeof(struct ListNode));//移动到存储节点cur = cur -> next;//存储结果cur -> val = flag;//初始化其指针,防止其任意指向一个地址cur -> next = NULL;}//输出结果return ret -> next;
}

两数相加—C语言逐位相加版(注释详尽)相关推荐

  1. 大数相加c语言思路,大数相加

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include /** * * 定义双向节点 * 数据区为一个整型数字 * **/ struct Node { int number; ...

  2. 比较两数大小c语言,C语言比较两个数字的大小

    问题描述: C语言比较两个数字的大小 #include int max(int a,int b); main() { int x,y; printf("input two numbers:\ ...

  3. java现代编译原理pdf脚本之家,两周自制脚本语言 PDF 高清版

    用python写了个数据迁移脚本,主要是利用从库将大的静态表导出表空间,载导入到目标实例中. #!/usr/bin/env python3#-*- coding:utf8 -*-#author:zha ...

  4. 【每日一算法】两数相加

    微信改版,加星标不迷路! 每日一算法-两数相加 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两 ...

  5. 力扣每日一题——两数相加II

    发现做的题难度始终不高,今天Leecode给了一个稍微难一点的题目.(前两天没更是因为去拔牙了~~>_<~~) 给你两个 非空 链表来代表两个非负整数.数字最高位位于链表开始位置.它们的每 ...

  6. LeetCode之两数相加

    1.题目 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示 ...

  7. 两数相除之分析问题解决问题

    分析解决问题 前言 一.两数相除 二.位运算 总结 参考文献 前言 做题不要杂乱无章的想,单凭记忆去模仿,而是要抓住问题中所给的你认为的关键,去分析,去找方法解决. 一.两数相除 二.位运算 pack ...

  8. c语言两数相加vs,两数相加(C语言)

    两数相加 给出两个 非空 的链表用来表示两个非负的整数. 其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来 ...

  9. 力扣 两数相加 C语言 题解

    ** 力扣 两数相加 C语言 题解 ** 文章目录 力扣 两数相加 C语言 题解 一.完整题目 二.解题思路 二.编写代码 四.测评结果 五.总结评价 一.完整题目 给你两个非空的链表,表示两个非负的 ...

最新文章

  1. windows 10 代理服务器出现问题
  2. 【深度学习】使用Python+PyTorch预测野外火灾
  3. DCN RepPoints解读
  4. Redis底层数据结构实现
  5. 数据结构与算法——选择排序
  6. IOS – OpenGL ES 调节图像阴影 GPUImageHighlightShadowFilter
  7. MiniO 磁盘缓存快速入门
  8. mysql count or null_为什么在对带有条件的行进行计数时,为什么在MySQL中需要“ OR NULL”...
  9. python dataframe列名_pandas 修改 DataFrame 列名
  10. VBA实现Excel模块筛选高级应用场景!
  11. Kubernetes之YAML语法
  12. 35岁了,依然倔强的相信未来!——我的2021年终总结
  13. JS 进阶 (六) 浏览器事件模型DOM操作
  14. 矩阵笔记1:矩阵分析(第三版)-史荣昌-第一章:线性空间和线性变换
  15. SLAM笔记(六)直接法介绍
  16. HTML标签根据浏览器窗口大小自适应
  17. 慢慢欣赏linux qemu编译和启动
  18. 每日软件分享:去图片水印免费软件有哪些?
  19. 终于找到海底的丢失的大铁锚
  20. 保险巨头安联将测试代币用于内部资金流转

热门文章

  1. python代码-你见过哪些令你瞠目结舌的 Python 代码技巧?
  2. 为什么黑客都用python-为什么黑客都用python Python在各领域都有着广
  3. python练手经典100例-【Python精华】100个Python练手小程序
  4. python项目开发实例-有趣的十个Python实战项目,让你瞬间爱上Python!
  5. Android语音识别开发详解(基于讯飞语音SDK)
  6. 成都专业语音转化为文字怎么样_安徽听见科技
  7. 微信AI开放接口介绍
  8. python selenium安装教程_Python Selenium模块安装使用教程详解
  9. 嵌入式linux调试dsi,做嵌入式开发时,你是怎么实现LCD显示的?
  10. MySQL 8.0安装记录