lucky&girl

导航

两数相加(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编辑  收藏  举报