链表-Add Two Numbers
第一版代码(很挫很罗嗦,不过是第一次做,记录一下成长的脚步!继续努力!)
1 /*struct ListNode { 2 int val; 3 struct ListNode *next; 4 };*/ 5 6 typedef struct ListNode ListNode; 7 8 struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) { 9 ListNode *result = (ListNode *)malloc(sizeof(ListNode)); 10 result->next = NULL; 11 ListNode *now = result; 12 13 ListNode *p1 = l1; 14 ListNode *p2 = l2; 15 int carry = 0; 16 17 while(p1&&p2) 18 { 19 ListNode *p = (ListNode *)malloc(sizeof(ListNode)); 20 p->next = NULL; 21 int r = p1->val + p2->val + carry; 22 carry = r/10; 23 p->val = r%10; 24 now->next = p; 25 now = now->next; 26 p1 = p1->next; 27 p2 = p2->next; 28 } 29 30 while(p1) 31 { 32 ListNode *p = (ListNode *)malloc(sizeof(ListNode)); 33 p->next = NULL; 34 int r = p1->val + carry; 35 carry = r/10; 36 p->val = r%10; 37 now->next = p; 38 now = now->next; 39 p1 = p1->next; 40 } 41 42 while(p2) 43 { 44 ListNode *p = (ListNode *)malloc(sizeof(ListNode)); 45 p->next = NULL; 46 int r = p2->val + carry; 47 carry = r/10; 48 p->val = r%10; 49 now->next = p; 50 now = now->next; 51 p2 = p2->next; 52 } 53 if(carry) 54 { 55 ListNode *p = (ListNode *)malloc(sizeof(ListNode)); 56 p->next = NULL; 57 p->val = carry; 58 now->next = p; 59 now = now->next; 60 } 61 62 return result->next; 63 64 }
要注意返回的内容必须符合题目要求,一开始我直接返回了result,但是leetcode测试的时候会把空的头结点也输出,不符合题目要求。
要全面考虑问题,这题的特殊情况主要体现在进位部分,如999+1这种情况,还有就是两个数的位数可能会不同。
可以使用条件操作符对代码进行简化,简化版如下:
1 void addTwoNumbers(struct ListNode* l1, struct ListNode* l2) 2 { 3 ListNode *result = (ListNode *)malloc(sizeof(ListNode)); 4 result->next = NULL; 5 ListNode *now = result; 6 7 ListNode *p1 = l1; 8 ListNode *p2 = l2; 9 int carry = 0; 10 11 while(p1&&p2) 12 { 13 ListNode *p = (ListNode *)malloc(sizeof(ListNode)); 14 p->next = NULL; 15 int r = p1->val + p2->val + carry; 16 carry = r/10; //进位 17 p->val = r%10; 18 now->next = p; //插入到result链表中 19 now = now->next; 20 p1 = p1->next; 21 p2 = p2->next; 22 } 23 24 ListNode *p3 = p1?p1:p2; 25 while(p3) 26 { 27 ListNode *p = (ListNode *)malloc(sizeof(ListNode)); 28 p->next = NULL; 29 int r = p3->val + carry; 30 carry = r/10; //进位 31 p->val = r%10; 32 now->next = p; //插入到result链表中 33 now = now->next; 34 p3 = p3->next; 35 } 36 37 if(carry) 38 { 39 ListNode *p = (ListNode *)malloc(sizeof(ListNode)); 40 p->next = NULL; 41 p->val = carry; 42 now->next = p; //插入到result链表中 43 now = now->next; 44 } 45 46 47 Print(result->next); 48 49 }
【待补充C++版本。。。】