1.题目描述

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

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

示例 1:

 Leetcode题目总结[2]两数相加_测试点

Leetcode题目总结[2]两数相加_链表_02

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

示例 2:

输入:l1 = [0], l2 = [0]
输出:[0]

示例 3:

输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

 

提示:

  • 每个链表中的节点数在范围 [1, 100] 内
  • 0 <= Node.val <= 9
  • 题目数据保证列表表示的数字不含前导零
2.代码

C语言:

 1 /*
 2  * @lc app=leetcode.cn id=2 lang=c
 3  *
 4  * [2] 两数相加
 5  */
 6 
 7 // @lc code=start
 8 /**
 9  * Definition for singly-linked list.
10  * struct ListNode {
11  *     int val;
12  *     struct ListNode *next;
13  * };
14  */
15 /*#include<stdio.h>
16 struct ListNode {
17      int val;
18      struct ListNode *next;
19  };*/
20 struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){  
21     struct ListNode* p1=l1;//p1指向l1
22     struct ListNode* p2=l2;//p2指向l2
23     struct ListNode* result = (struct ListNode *)malloc(sizeof(struct ListNode));
24     struct ListNode* p3 = result;
25     p3 -> val = 0;
26     p3 -> next = NULL;//az 第二个测试点缺这一句
27     int temp = 0;
28     do
29     {
30         //printf("%d %d %d\n",p1 -> val,p2 -> val,p3 ->val);
31         if(p1 != NULL && p2 != NULL)
32         {
33             //printf("1\n");
34             p3 -> val += (p1 -> val + p2 ->val) + temp;
35             temp = p3 -> val / 10;
36             p3 -> val %= 10;
37             if(p1 -> next != NULL) p1 = p1 -> next;
38             else p1 = NULL;
39             if(p2 -> next != NULL) p2 = p2 -> next;
40             else p2 = NULL;
41             if(temp != 0 || p1 || p2)
42             {
43                 p3 -> next = (struct ListNode *)malloc(sizeof(struct ListNode));
44            
45                 p3 = p3 -> next;
46                 p3 -> next = NULL;
47                 p3 -> val = 0;
48             }
49             
50         }
51         else if(p1 == NULL)
52         {
53             p3 -> val += temp + p2 ->val;    
54             p2 = p2 -> next;
55             temp = p3 -> val / 10;
56             p3 -> val %= 10;
57             if(temp != 0 || p2 != NULL)
58             {
59                 p3 -> next = (struct ListNode *)malloc(sizeof(struct ListNode));
60             
61                 p3 = p3 -> next;
62                 p3 -> next = NULL;
63                 p3 -> val = 0;
64             }
65             
66         }
67         else if(p2 == NULL)
68         {
69             p3 -> val += p1 -> val + temp;
70             p1 = p1 -> next;
71             temp = p3 -> val / 10;
72             p3 -> val %= 10;
73             if(temp != 0 || p1 != NULL)
74             {
75                 p3 -> next = (struct ListNode *)malloc(sizeof(struct ListNode));
76             
77                 p3 = p3 -> next;
78                 p3 -> next = NULL;
79                 p3 -> val = 0;
80             }
81             
82             
83         }
84         
85         
86         
87         
88     }while(p1 || p2);
89     if(temp != 0 && p3)
90     {
91         p3 -> val += temp;
92     }
93     return result;
94     
95 }
96 // @lc code=end

简单链表应用

 3.做题在遇到的错误

中间遇到过几个错误,出错代码当时忘了记 只记得错误提示了

runtime error: member access within null pointer of type 'struct ListNode'

 

runtime error: member access within misaligned address 0xbebebebebebebebe for type 'struct ListNode'

这个错误是因为在定义指针后,由于结构体中存在next指针,申请结构体空间的时候定义了next指针,而这个next指针未指向任何空间

第二个测试点 0 + 0 = 0 不过就是缺一句p -> next = NULL;