C语言链表之两数相加

题目描述

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

 

示例

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

 

题目要求

 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 }

 

题解

 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     int temp=0;
12     struct ListNode *p1=l1;
13     struct ListNode *p2=l2;
14     struct ListNode *p3 = (struct ListNode*)malloc(sizeof(struct ListNode));
15     struct ListNode *l3=p3;
16     for(int i=0;;i++){
17         if(p1==NULL&&p2==NULL){//两数结束
18             if(temp==1){//判断进位
19                 struct ListNode *p4 = (struct ListNode*)malloc(sizeof(struct ListNode));
20                 p4->val=1;
21                 p4->next=NULL;
22                 p3->next=p4;
23                 p3=p4;
24             }
25             break;
26         }
27         else if(p1==NULL){//数一结束
28             while(p2!=NULL){
29                 struct ListNode *p4= (struct ListNode*)malloc(sizeof(struct ListNode));
30                 int sum=p2->val+temp;
31                 temp=sum/10;
32                 sum%=10;
33                 p4->val=sum;
34                 p4->next=NULL;
35                 p3->next=p4;
36                 p3=p4;
37                 p2=p2->next;
38                 if(p2==NULL)break;
39             }
40             if(temp!=0){//数二也结束后判断进位
41                 struct ListNode *p4= (struct ListNode*)malloc(sizeof(struct ListNode));
42                 p4->val=1;
43                 p4->next=NULL;
44                 p3->next=p4;
45             }
46             break;
47         }
48         else if(p2==NULL){
49             while(1){
50                 struct ListNode *p4= (struct ListNode*)malloc(sizeof(struct ListNode));
51                 int sum=p1->val+temp;
52                 temp=sum/10;
53                 sum%=10;
54                 p4->val=sum;
55                 p4->next=NULL;
56                 p3->next=p4;
57                 p3=p4;
58                 p1=p1->next;
59                 if(p1==NULL)break;
60             }
61             if(temp!=0){
62                 struct ListNode *p4= (struct ListNode*)malloc(sizeof(struct ListNode));
63                 p4->val=1;
64                 p4->next=NULL;
65                 p3->next=p4;
66             }
67             break;
68         }
       //两数都未结束,正常相加
69 int sum=p1->val+p2->val+temp; 70 temp=sum/10; 71 sum%=10; 72 struct ListNode *p4 = (struct ListNode*)malloc(sizeof(struct ListNode)); 73 p4->val=sum; 74 p4->next=NULL; 75 p3->next=p4; 76 p3=p4; 77 p1=p1->next; 78 p2=p2->next; 79 } 80 return l3->next; 81 }

 

1.malloc

用于动态分配内存,用法为:

int *p = (int *)malloc(sizeof(int))

char *ch = (char *)malloc(sizeof(char))

返回一个指针,当资源不足无法分配时返回NULL

可用free()释放内存,用法为:

free(p)

free(ch)

 

2..链表

第一次写链表,只涉及了链表末端的节点添加,以后继续学习删除、插入、连接等操作,感觉不难,只是在玩IQ题,不过......链表还是得继续好好刷题!

该题的链表节点包括了节点值和下一个节点的位置两个内容,节点值可以是整型、数组等一个或多个变量,下一个节点的位置用p->next引用,但是p->next->value是错误的。

本题需要注意的点是在两数相加时、一数结束时、两数都结束时判断是否需要进一位。

 

题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

posted @ 2019-10-10 17:05  DiKa  阅读(1464)  评论(0编辑  收藏  举报