问题描述:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解答:
方法一:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
int TempAdd = 0;
//定义链表指针
struct ListNode*p2,*p3;
struct ListNode*p1;
//新建存放运算结果的节点
struct ListNode* l3 = (struct ListNode*)malloc(sizeof(struct ListNode));
l3->val = 0;
l3->next = NULL;
//链表指针指向对应链表
p1 = l3; //结果
p2 = l1; //加数
p3 = l2; //被加数
while((NULL != p2)&&(NULL != p3)) //两个链表都未到尾部
{
//新建节点
struct ListNode* Node = (struct ListNode*)malloc(sizeof(struct ListNode));
Node->val = 0;
Node->next = NULL;
TempAdd = 0; //复位
p1->val += p2->val + p3->val; //相加
if(p1->val >= 10)
{
TempAdd++; //进位
Node->val = TempAdd; //将进位值写到节点里
p1->val = p1->val %10;//取个位
}
//p2 p3指向下一个节点
p2 = p2->next;
p3 = p3->next;
//若p2 p3到达了末尾且没有进位
if((NULL == p3) && (NULL == p2) && (0 == TempAdd))
{
p1->next = NULL; //改将p1指向NULL
free(Node);
}
else
{
p1->next = Node;
p1 = p1->next; //将p1指向新建的节点
}
}
while(NULL != p2) //p2未到尾部
{
//新建节点
struct ListNode* Node = (struct ListNode*)malloc(sizeof(struct ListNode));
Node->val = 0;
Node->next = NULL;
TempAdd = 0;
p1->val += p2->val; //进位和p2相加
if(p1->val >= 10)
{
TempAdd++; //进位
Node->val = TempAdd; //将进位值写到节点里
p1->val = p1->val%10;//取个位
}
p2 = p2->next;
//若p2到达了末尾且没有进位
if((NULL == p2) && (0 == TempAdd))
{
p1->next = NULL; //改将p1指向NULL
free(Node);
}
else
{
p1->next = Node;
p1 = p1->next; //将p1指向新建的节点
}
}
while(NULL != p3) //p3未到尾部
{
//新建节点
struct ListNode* Node = (struct ListNode*)malloc(sizeof(struct ListNode));
Node->val = 0;
Node->next = NULL;
TempAdd = 0;
p1->val += p3->val; //进位和p2相加
if(p1->val >= 10)
{
TempAdd++; //进位
Node->val = TempAdd; //将进位值写到节点里
p1->val = p1->val%10;//取个位
}
p3 = p3->next;
//若p3到达了末尾且没有进位
if((NULL == p3) && (0 == TempAdd))
{
p1->next = NULL; //改将p1指向NULL
free(Node);
}
else
{
p1->next = Node;
p1 = p1->next; //将p1指向新建的节点
}
}
//指针复位
p1 = l3; //结果
p2 = l1; //加数
p3 = l2; //被加数
return l3;
}
运行结果:
方法二:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode *p1 = l1;
struct ListNode *p2 = l2;
struct ListNode *tail = NULL;
struct ListNode *head = tail;
int add = 0;
int sum = 0;
while(p1 != NULL || p2 != NULL){
//根据长链短链选择计算方式
if(p1 == NULL){
sum = p2->val + add;
}
else if(p2 == NULL){
sum = p1->val + add;
}
else{
sum = p1->val + p2->val + add;
}
//计算
if(head == NULL){//若第一次计算
head = tail = (struct ListNode*)malloc(sizeof(struct ListNode));
tail->val = sum % 10;
tail->next = NULL;
}
else{
tail->next = (struct ListNode*)malloc(sizeof(struct ListNode));
tail = tail->next; //指针后移
tail->val = sum % 10;
tail->next = NULL;
}
//考虑进位
add = sum / 10;
//指向各自链表下一个结点
if(p1){
p1 = p1->next;
}
if(p2){
p2 = p2->next;
}
}
//算add进位
if(add > 0){
tail->next = (struct ListNode*)malloc(sizeof(struct ListNode));
tail = tail->next;
tail->val = add;
tail->next = NULL;
}
return head;
}
运行结果: