链表-Add Two Numbers

本文详细介绍了如何使用链表结构实现整数相加运算,重点关注了进位处理、不同长度链表的处理及代码优化,旨在通过实际编程案例提升读者对链表操作的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一版代码(很挫很罗嗦,不过是第一次做,记录一下成长的脚步!继续努力!)  

 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++版本。。。】

转载于:https://www.cnblogs.com/summerkiki/p/5236193.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值