两数相加c语言实现

给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。

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

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
解题思路:我先开始的思路是,再创建一个返回链表,然后将两个数的和放到返回链表中返回,具体处理的时候,先检查每一位相加时前面是不是有进位,如果有进位,则在相加的时候加上进位的值,在计算出每一位的和之后,如果和的值小于10,则没有进位,进位标志位false,进位值不做修改,如果有进位,则进位标志位true,进位值做相应的修改。然后我的初始代码如下:
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {bool Carry=false;int  Carry_Val=0;int  temp; struct ListNode *p1,*p2,*Ret_List;p1=(struct ListNode*)malloc(sizeof(struct ListNode));p1->next=NULL;Ret_List=p1;p2=p1;while(l1&&l2){if(Carry){temp=Carry_Val+l1->val+l2->val;if(temp<10){Carry=false;p2->val=temp;}else{Carry=true;p2->val=temp-10;;Carry_Val=temp/10;}}else{temp=l1->val+l2->val;if(temp<10){Carry=false;p2->val=temp;}else{Carry=true;p2->val=temp-10;Carry_Val=temp/10;}}l1=l1->next;l2=l2->next;if(l1||l2){p1=(struct ListNode*)malloc(sizeof(struct ListNode));p1->next=NULL;p2->next=p1;p2=p1;}}while(l1){if(Carry){temp=Carry_Val+l1->val;if(temp<10){Carry=false;p2->val=temp;}else{Carry=true;p2->val=temp-10;Carry_Val=temp/10;}}else{temp=l1->val;if(temp<10){Carry=false;p2->val=temp;}else{Carry=true;p2->val=temp-10;Carry_Val=temp/10;}}l1=l1->next;if(l1){p1=(struct ListNode*)malloc(sizeof(struct ListNode));p1->next=NULL;p2->next=p1;p2=p1;}}while(l2){if(Carry){temp=Carry_Val+l2->val;if(temp<10){Carry=false;p2->val=temp;}else{Carry=true;p2->val=temp-10;Carry_Val=temp/10;}}else{temp=l2->val;if(temp<10){Carry=false;p2->val=temp;}else{Carry=true;p2->val=temp-10;Carry_Val=temp/10;}}l2=l2->next;if(l2){p1=(struct ListNode*)malloc(sizeof(struct ListNode));p1->next=NULL;p2->next=p1;p2=p1;}}if(Carry){p1=(struct ListNode*)malloc(sizeof(struct ListNode));p1->next=NULL;p2->next=p1;p2=p1;p2->val=Carry_Val;}return Ret_List;}
这明显太长太长了,中间有非常多的重复代码。然后我发现,我在计算Carry_Val(即进位值)的值得时候,要判断是不是有进位,但是我发现,当有进位的时候temp/10,能计算出进位的值,但是,当没有进位的时候,temp/10的值为0。这就为我提供了一个新的解题方法。代码如下:
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {int  Carry_Val=0;int  temp; struct ListNode *p1,*p2,*Ret_List;p1=(struct ListNode*)malloc(sizeof(struct ListNode));p1->next=NULL;Ret_List=p1;p2=p1;while(l1&&l2){temp=l1->val+l2->val+Carry_Val;p2->val=temp%10;Carry_Val=temp/10;l1=l1->next;l2=l2->next;if(l1||l2){p1=(struct ListNode*)malloc(sizeof(struct ListNode));p1->next=NULL;p2->next=p1;p2=p1;}}while(l1){temp=l1->val+Carry_Val;p2->val=temp%10;Carry_Val=temp/10;l1=l1->next;if(l1){p1=(struct ListNode*)malloc(sizeof(struct ListNode));p1->next=NULL;p2->next=p1;p2=p1;}}while(l2){temp=l2->val+Carry_Val;p2->val=temp%10;Carry_Val=temp/10;l2=l2->next;if(l2){p1=(struct ListNode*)malloc(sizeof(struct ListNode));p1->next=NULL;p2->next=p1;p2=p1;}}if(Carry_Val){p1=(struct ListNode*)malloc(sizeof(struct ListNode));p1->next=NULL;p2->next=p1;p2=p1;p2->val=Carry_Val;}return Ret_List;}
可以看出,代码量有了极大的简化。但是还有很多重复代码,于是我就又进行了改进,代码如下:
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {  int  Carry_Val=0;  int  temp;   struct ListNode *p1,*p2,*Ret_List;  Ret_List=l1;  while(l1&&l2){  temp=l1->val+l2->val+Carry_Val;  l1->val=temp%10;  Carry_Val=temp/10; p2=l1;l1=l1->next;  l2=l2->next;  } if(!l1){p2->next=l2;l1=p2->next;}while(l1){  temp=l1->val+Carry_Val;  l1->val=temp%10;  Carry_Val=temp/10;p2=l1;l1=l1->next;  }  if(Carry_Val){  p1=(struct ListNode*)malloc(sizeof(struct ListNode));  p1->next=NULL;      p1->val=Carry_Val; p2->next=p1;}  return Ret_List;  }  

这就很nice了,空间复杂度也极大的降低了。
欢迎留言评论交流。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375990.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jQuery获取Select选择的Text和Value

一、 jQuery获取Select选择的Text和Value:语法解释&#xff1a; $("#select_id").change(function(){//code...}); //为Select添加事件&#xff0c;当选择其中一项时触发varcheckText$("#select_id").find("option:selected").tex…

jquery实现导航栏鼠标点击后实行背景高亮,点击离开恢复(超级简单!!!!)...

昨天才写了一个方法&#xff0c;今天发现一个更简单的。 html&#xff1a; <!DOCTYPE html> <html> <head lang"en"><meta charset"UTF-8"><title></title> </head> <body> <div class"dianji&qu…

Linux怎么处理binray文件,Linux下如何反汇编arm raw binary文件

有一个arm elf文件经过objcopy -O binary 命令处理生成bin文件进行反汇编:指令1&#xff1a;arm_v5t_le-objdump -b binary -m armv5te -D u-boot.bin|head指令2&#xff1a;arm-linux-objdump -D -b binary test.bin --architecturearm > /tmp/raw.txthttp://linux.chi…

putty连虚拟机中Linux出现Access Denied

环境&#xff1a;VMwarekali Linux出现这个问题&#xff0c;肯定是你想尝试直接通过使用root账户连接你的linux&#xff0c;这样肯定是不行的&#xff0c;why&#xff1f;为了保证服务器安全&#xff0c;几乎所有的服务器都禁止了超级用户直接登录系统&#xff0c;而是通过普通…

Floyd算法应用-医院选址问题

1)问题描述 n个村庄之间的交通图可以用有向网图来表示&#xff0c;图中边<vi, vj>上的权值表示从村庄i到村庄j的道路长度。现在要从这n个村庄中选择一个村庄新建一所医院&#xff0c;问这所医院应建在哪个村庄&#xff0c;才能使所有的村庄离医院都比较近&#xff1f; 2)…

linux ls 命令排序,如何在Linux中使用ls命令按大小对所有文件进行排序

ls命令是列出目录内容的最流行且非常有用的命令。 在本文中&#xff0c;我们将解释如何使用ls sort选项按大小列出目录内容。1)按大小列出目录中的文件(排序)要列出具有大小排序的特定目录的内容&#xff0c;我们将使用-lS选项和ls命令。 它将在顶部显示最大的文件。[linuxidcl…

C​#​获​取​当​前​时​间​的​各​种​格​式

C#获取当前时间的各种格式 DateTime.Now.ToShortTimeString() DateTime dt DateTime.Now; dt.ToString();//2005-11-5 13:21:25 dt.ToFileTime().ToString();//127756416859912816 dt.ToFileTimeUtc().ToString();//127756704859912816 dt.ToLocalTime().ToString(…

基于tcp connect的端口扫描程序

原理&#xff1a;connect()函数用于对于每一个感兴趣的目标计算机的端口进行连接&#xff0c;如果该端口处于侦听状态&#xff0c;那么connect()就会成功&#xff0c;即没有提供服务。如果对于每一个目标端口以串行的方式使用单独的connect()调用&#xff0c;需要较长的时间&am…

UIScrollView

一、UIScrollView 1.常见属性 property(nonatomic) CGPoint contentOffset; // 记录UIScrollView滚动的位置 property(nonatomic) CGSize contentSize; // 内容尺寸&#xff08;能滚动的范围&#xff09; property(nonatomic) UIEdgeInsets contentInset; // 额外增加的滚动区域…

linux如何运行多个硬盘,一个硬盘如何装两个Linux

1个硬盘已安装Fedora 8 Linux系统&#xff0c;并安装grub引导管理程序&#xff0c;现要在这个硬盘的空闲分区中安装Fedora 9&#xff0c;操作如下&#xff1a;1.将Fedora-9-i386-DVD.iso文件放到一个Windows Fat32分区((hd0,4))的根目录&#xff0c;将这个iso文件中的isolinux目…

APIO2015 酱油记

Day 0 昨天CTSC才比完&#xff0c;当然是要浪啦&#xff01; 于是浪了一天。。。午饭都没吃。。。 晚饭。。。貌似也没吃。。。 晚上的时候觉得这样子浪不太好&#xff0c;还是要认真一下&#xff0c;打开bzoj&#xff0c;弃疗了。。。还是浪吧。。。 Day 1 今天要讲课&#xf…

宏定义 #define 和常量 const 的区别

学习笔记&#xff01;参考链接 一、类型和安全检查不同宏定义是字符替换&#xff0c;没有数据类型的区别&#xff0c;同时这种替换没有类型安全检查&#xff0c;可能产生边际效应等错误&#xff1b;const常量是常量的声明&#xff0c;有类型区别&#xff0c;需要在编译阶段进行…

【ibus】设置ibus输入法(pinyin sunpinyin)

设置ibus-pinyin 在终端中运行 /usr/lib/ibus-pinyin/ibus-setup-pinyin命令可以调出ibus的完整设置对话框 设置ibus-sunpinyin 可以执行ibus-sunpinyin自带的python设置脚本ibus-setup-sunpinyin来全面设置它 : $ /usr/lib/ibus-sunpinyin/ibus-setup-sunpinyin 如果执行此脚…

linux 进程 释放内存,Linux 释放内存方法和原理

今天惊愕地发现&#xff0c;主节点上8G内存被不知道什么进程吃掉了整整6G有余&#xff0c;正常的计算快要维持不下去了&#xff0c;遂处理之。先看看内存使用状况[rootnode1 ~]# free -mtotal used free shared buffers cachedMem: 8004 6557 1446 0 163 5630-/ buffers/cache:…

玩转Win32开发(2):完整的开发流程

上一篇中我给各位说了一般人认为C中较为难的东西——指针。其实对于C&#xff0c;难点当然不局限在指针这玩意儿上&#xff0c;还有一些有趣的概念&#xff0c;如模板类、虚基类、纯虚函数等&#xff0c;这些都是概念性的东西&#xff0c;几乎每一本C书上都会介绍&#xff0c;而…

c++函数传参:值传递、指针传递、引用传递

1、将变量名作为实参和形参&#xff1a; 这时传给形参的是变量的值&#xff0c;传递是单向的。如果在执行函数期间形参的值发生变化&#xff0c;并不传回实参。应为在调用函数时&#xff0c;形参和实参不是同一个存储单元。 2、传递变量的指针&#xff1a; 形参是指针变量&a…

赞!带进度条的 jQuery 文件拖放上传插件

jQuery File Uploader 是一个 jQuery 文件拖放上传插件&#xff0c;包括 Ajax 上传和进度条效果。作者编写这个插件的想法是要保持它非常简单&#xff0c;不像其他的插件&#xff0c;很多的标记&#xff0c;并提供一些 Hack 的方式使之兼容那些古老的浏览器。jQuery File Uploa…

linux系统有几个系统盘,linux操作系统的分区有哪些种类?各分区主要作用是什么?...

满意答案Linux下一切都是文件&#xff0c;不存在分区的概念&#xff0c;在Linux下说的分区只是磁盘管理和数据组织的需要。Linux使用标准的目录结构&#xff0c;在安装的时候&#xff0c;安装程序就已经为用户创建了文件系统和完整而固定的目录组成形式&#xff0c;并指定了每个…

::范围解析运算符

学习笔记&#xff1a;参考链接 ::是范围解析运算符&#xff0c;或者称为域区分符&#xff0c;用来指明一个函数或一个数据属于哪一个类。 ::也可以不跟类名&#xff0c;表示全局函数或者全局数据 eg: #include<iostream> using namespace std;int month;//全局变量 i…

渴望

有些时候 还是会觉得很孤独 因为自己总是一个人 一个人吃饭 一个人学习 一个人生活 心情难免会低落 很想有一个人 可以一直陪伴在自己身边 一起吃饭 一起学习 一起看潮起潮落 以为自己足够坚强 可以耐得住很多孤独 却总还是会 感觉lonely 很多时候很羡慕 那些大学里的小情侣 虽…