c语言两数相加vs,两数相加(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 }

标签:body,ListNode,struct,val,相加,C语言,next,signal

来源: https://www.cnblogs.com/jiaxiaoxu/p/11474375.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值