兩數相加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.pswp.cn/news/375990.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375990.shtml
英文地址,請注明出處:http://en.pswp.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 很多時候很羨慕 那些大學里的小情侶 雖…