# Add Two Numbers ###### tags: `LeetCode` `medium` `linkedlist` >Golang ```go= /** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */ func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode { head:=&ListNode{Val:0,Next:nil} cur:=head carry:=0 for l1!=nil||l2!=nil { var x,y int if l1!=nil{ x=l1.Val }else{ x=0 } if l2!=nil{ y=l2.Val }else{ y=0 } sum:=x+y+carry carry=sum/10 cur.Next=&ListNode{Val:sum%10,Next:nil} cur=cur.Next if l1!=nil{ l1=l1.Next } if l2!=nil{ l2=l2.Next } } if carry==1{ cur.Next=&ListNode{Val:1,Next:nil} } return head.Next } ``` :::info Runtime: 12 ms, faster than 60.49% of Go online submissions for Add Two Numbers. Memory Usage: 5 MB, less than 12.20% of Go online submissions for Add Two Numbers. ::: :::danger 15~24行 必須判斷 l1 l2 是否為空,不然讀取到 nil 會造成 segmentation fault 29~32行 同上必須判斷是否為空,不然也會造成 segmentation fault 36~38行 則是如果 carry 還是1時,則要多創一個 node Val=1 適用情況為 [5] [7] ans: [2][1],如果少了就會變成 ans:[2] 算是例外狀況 ::: >cpp ```cpp= /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { ListNode *head= new ListNode(0); ListNode *cur=head; int carry=0; while(l1!=NULL||l2!=NULL){ int x=(l1!=NULL)?l1->val:0; int y=(l2!=NULL)?l2->val:0; int sum=x+y+carry; carry=sum/10; cur->next=new ListNode(sum%10); cur=cur->next; l1=l1?l1->next:l1; l2=l2?l2->next:l2; } if(carry>0) cur->next=new ListNode(carry); return head->next; } }; ``` :::info Runtime: 24 ms, faster than 90.22% of C++ online submissions for Add Two Numbers. Memory Usage: 11.1 MB, less than 5.14% of C++ online submissions for Add Two Numbers. ::: :::danger 注意事項相同,只是變更為三元條件 ::: >c language > ```c= /*struct ListNode { int val; struct ListNode *next; };*/ struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){ int carry = 0; int outNum = 0; int num1 = 0; int num2 = 0; struct ListNode* resultList = NULL; struct ListNode* ptr = NULL; struct ListNode* priPtr = NULL; resultList = (struct ListNode*)malloc(sizeof(struct ListNode)); ptr = resultList; while(l1 != NULL || l2 != NULL){ num1 = 0; num2 = 0; if(l1 != NULL){ num1 = l1->val; l1 = l1->next; } if(l2 != NULL){ num2 = l2->val; l2 = l2->next; } int tmp = num1 + num2 + carry; if(tmp >= 10){ outNum = tmp - 10; carry = 1; }else{ outNum = tmp; carry = 0; } ptr->val = outNum; struct ListNode* node = (struct ListNode*)malloc(sizeof(struct ListNode)); if(!node) return NULL; node->next = NULL; ptr->next = node; priPtr = ptr; ptr = node; } if(carry == 1){ ptr->val = carry; }else{ priPtr->next = NULL; free(ptr); } return resultList; } ``` :::info Runtime: 16 ms, faster than 52.16% of C online submissions for Add Two Numbers. Memory Usage: 7.5 MB, less than 100.00% of C online submissions for Add Two Numbers. :::