- 两数相加
题目描述
解题思路
代码执行
题目描述
给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
解题思路
虽然题目给的是逆序相加,但是规则是和同序相加一致,理解了这一点,编码就相对容易很多。
**
**
代码执行
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode* sum;
struct ListNode* result = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode *p1,*p2;
p1 = l1;
p2 = l2;
result->next = NULL;
int add = 0;
int val1 = 0;
int val2 = 0;
sum = result;
while((p1 != NULL) || (p2 != NULL) || (add != 0))
{
struct ListNode* temp = (struct ListNode*)malloc(sizeof(struct ListNode));
temp->next = NULL;
sum->next = temp;
sum = temp;
if(p1 != NULL)
{
val1 = p1->val;
}
else
{
val1 = 0;
}
if(p2 != NULL)
{
val2 = p2->val;
}
else
{
val2 = 0;
}
temp->val = (val1 + val2 + add)%10;
add = (val1 + val2 + add)/10;
if(p1!=NULL)
{
p1 = p1->next;
}
if(p2 != NULL)
{
p2 = p2->next;
}
}
return result->next;
}
Note:最后去判断p1和p2是不是需要向后偏移,是通过当前指针指向的位置是不是为空,如果判断p1->next或者p2->next是否为空,会导致程序超时。