两数相加(C语言)
两数相加
给出两个 非空 的链表用来表示两个非负的整数。
其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807
分析:首先,既然是两个非空链表,那么就不用考虑链表为空的情况了;
这道题我原本想先把两个整数相加,然后把相加后的和的位数按照逆序用链表存储一下,但是这样会有一个问题,如果链表特别长的话,整数就会特别大,就会溢出,显然这样做是行不通的。
因为两个整数的位数是按照逆序的方式存储的,那么每个链表的第一个元素都是个位,那么依次遍历两个链表从个位开始相加就可以,同时用 signal 来记录是否需要进位,若需要进位就把 signal 设置为1,计算更高一位的时候把 signal 的值也加上即可。
下边是代码实现:
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * struct ListNode *next; 6 * }; 7 */ 8 9 10 struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){ 11 struct ListNode*list1 = l1; 12 struct ListNode*list2 = l2; 13 int signal = 0; 14 struct ListNode *list = (struct ListNode *)malloc(sizeof(struct ListNode)); 15 list->next = NULL; 16 if(list1->val+list2->val+signal>=10){ 17 list->val = list1->val+list2->val+signal-10; 18 signal=1; 19 }else{ 20 list->val = list1->val+list2->val+signal; 21 signal=0; 22 23 } 24 struct ListNode *temp = list; 25 list1=list1->next; 26 list2=list2->next; 27 while(list1!=NULL&&list2!=NULL){ 28 struct ListNode *body = (struct ListNode *)malloc(sizeof(struct ListNode)); 29 body->next=NULL; 30 printf("!!!!!!%d",signal); 31 if(list1->val+list2->val+signal>=10){ 32 body->val=list1->val+list2->val+signal-10; 33 signal=1; 34 }else{ 35 body->val=list1->val+list2->val+signal; 36 signal=0; 37 } 38 list1 = list1->next; 39 list2 = list2->next; 40 temp->next = body; 41 temp = temp->next; 42 43 } 44 if(list1==NULL&&list2==NULL){ 45 if(signal==0){ 46 return list; 47 }else{ 48 struct ListNode *body = (struct ListNode *)malloc(sizeof(struct ListNode)); 49 body->next=NULL; 50 body->val=1; 51 temp->next = body; 52 temp=temp->next; 53 return list; 54 } 55 } 56 57 if(list1!=NULL){ 58 if(signal==0){ 59 temp->next=list1; 60 return list; 61 }else{ 62 while(list1!=NULL){ 63 if(signal==0){ 64 temp->next=list1; 65 return list; 66 }else{ 67 struct ListNode *body = (struct ListNode *)malloc(sizeof(struct ListNode)); 68 body->next=NULL; 69 if(list1->val+signal>=10){ 70 body->val=0; 71 signal=1; 72 }else{ 73 body->val=list1->val+signal; 74 signal=0; 75 } 76 temp->next=body; 77 temp=temp->next; 78 } 79 list1 = list1->next; 80 } 81 } 82 } 83 84 if(list2!=NULL){ 85 if(signal==0){ 86 temp->next=list2; 87 return list; 88 }else{ 89 while(list2!=NULL){ 90 if(signal==0){ 91 temp->next=list2; 92 return list; 93 }else{ 94 struct ListNode *body = (struct ListNode*)malloc(sizeof(struct ListNode)); 95 body->next=NULL; 96 if(list2->val+signal>=10){ 97 body->val=0; 98 signal=1; 99 }else{ 100 body->val=list2->val+signal; 101 signal=0; 102 } 103 temp->next=body; 104 temp=temp->next; 105 } 106 list2 = list2->next; 107 } 108 } 109 } 110 if(signal==0){ 111 return list; 112 }else{ 113 struct ListNode *body = (struct ListNode *)malloc(sizeof(struct ListNode)); 114 body->next=NULL; 115 body->val = signal; 116 temp->next=body; 117 return list; 118 } 119 120 return list; 121 }
posted on 2019-09-06 13:38 lucky&girl 阅读(2936) 评论(0) 编辑 收藏 举报