题目描述
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
例:输入[2,4,5] [1,6,2] 输出[3,0,8],即542+261=803 。输入[5] [5]输出[0,1],即5+5=10 。输入[5,1] [5] 输出[0,2],即15+5=20 。
解题思路
函数的输入值为两组链表l1和l2,输出为l3 。添加两个过程量p3和p4 。具体见注释。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode *l3 = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode *p3 = l3;//最初p3和l3是相同的地址,修改p3的内容即修改l3的内容
int carry = 0;//低位是否满10进1
int sum = 0;//当前位相加的和
while( l1 && l2)//当前位两个数都不为0
{
sum = l1->val + l2->val + carry;
carry = sum / 10 ;//求商,满10为1,否则为0
sum = sum % 10;//求余,满10为sum-10,否则为sum
struct ListNode *p4 = (struct ListNode*)malloc(sizeof(struct ListNode));
p4->val = sum;
p4->next = NULL;
p3->next = p4;//第一次执行该语句时,相当于使l3的该节点指向p4
p3 = p4;//执行此语句后,对(*p3)赋值便不能影响到l3
l1 = l1->next;
l2 = l2->next;
}
while((l1&&!l2)||(!l1&&l2))//当前位有一个数为0
{
int value_1 = l1 ? (l1->val) : 0 ;
int value_2 = l2 ? (l2->val) : 0 ;
sum = value_1 + value_2 + carry ;
carry = sum / 10 ;
sum = sum % 10 ;
struct ListNode *p4 = (struct ListNode*)malloc(sizeof(struct ListNode));
p4->val = sum;
p4->next = NULL;
p3->next = p4;
p3 = p4;//再往后,对(*p3)赋值便不能影响到l3
l1 = l1 ? (l1->next) : NULL;
l2 = l2 ? (l2->next) : NULL;
}
if(!l1 && !l2 && carry)//当前位两个数均为0,但是低位满10进1
{
struct ListNode *p4 = (struct ListNode*)malloc(sizeof(struct ListNode));
p4->val = carry;
p4->next = NULL;
p3->next = p4;
}
return l3->next;//从l3的第二个节点开始赋值,所以从l3->next开始输出
}