@[力扣–C语言实现两数相加]
题目
给两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 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 *head = NULL,*tail = NULL; /*head头结点保持不动,tail一直往下处理,知道l1、l2为空*/
int sum = 0 , a = 0, b = 0 , carry = 0;;
while( l1 || l2)
{
a = l1 ? l1->val : 0; /*若l1不为空,a=l1.val ; l1为空,a=0 */
b = l2 ? l2->val : 0; /*若l2不为空,b=l2.val ; l2为空,b=0 */
sum = a + b + carry;
carry = sum/10; /*进位*/
if(!head) /*如果head为空,头节点、下一个节点赋值*/
{
head = tail = malloc(sizeof(struct ListNode)); /*先分配存储空间*/
head->val = tail->val = sum % 10; /*给分配存储空间的结构体变量赋值*/
tail->next = NULL; /*给分配存储空间的结构体变量赋值*/
}
else /*接连更新下一个节点的值*/
{
tail->next = malloc(sizeof(struct ListNode));
tail->next->val = sum % 10;
tail = tail->next;
tail->next = NULL;
}
if(l1) /*l1往下走*/
{
l1 = l1->next;
}
if(l2) /*l2往下走*/
{
l2 = l2->next;
}
}
if(carry) /*若有进位,新建一个节点放进位,合进链表*/
{
tail->next = malloc(sizeof(struct ListNode));
tail->next->val = carry;
tail = tail->next;
tail->next = NULL;
}
return head;
}