两数相加
给出两个 非空 的链表用来表示两个非负的整数。
其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 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 }
标签:body,ListNode,struct,val,相加,C语言,next,signal
来源: https://www.cnblogs.com/jiaxiaoxu/p/11474375.html