给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
该题是中等题,难度不大,只要找到方法即可。根据题目指示,位数是按照逆序的方式存储,即低位在链表头,高位在链表未。按照加法运算的基础做法,个位加个位等于结果的个位与进位,十位加十位再加上个位的进位等于结果的十位,以此类推算完整个加法运算即可得出答案。
具体思路:题目给出两个非空的链表作为加数,但是没有指明这两个链表的长度是一致的,所以运算时需要分为三种情况:1.链表l1和链表l2都不为空,分别取两个链表当前节点的值值相加并加上低位的进位得出当前位的结果和进位。2.链表l1为空,链表l2不为空,取链表l2当前节点的值并加上低位的进位得出当前位的结果和进位。3.链表l1不为空,链表l2为空,取链表l1当前节点的值并加上低位的进位得出当前位的结果和进位。每进行一位的运算后则跳到下一个节点循环进行相加操作,直到两个链表都取完数据。最后一位的运算结果需要判断是否大于10,如果大于等于10,则需要添加一个节点存放1。把所有的结果节点串起来则得到需要返回的链表结果。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
#include
#include
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
bool flag = 0;
struct ListNode* res = NULL;
struct ListNode* tmp = NULL;
while(NULL != l1 || NULL != l2 || flag){
if(NULL == res){
res = (struct ListNode *)malloc(sizeof(struct ListNode));
tmp = res;
tmp->next = NULL;
}else{
tmp->next = (struct ListNode *)malloc(sizeof(struct ListNode));
tmp = tmp->next;
tmp->next = NULL;
}
if(NULL != l1 && NULL != l2){
tmp->val = l1->val + l2->val + flag;
if(tmp->val >= 10){
flag = 1;
tmp->val -= 10;
}else{
flag = 0;
}
l1 = l1->next;
l2 = l2->next;
}
else if(NULL != l1 && NULL == l2){
tmp->val = l1->val + flag;
if(tmp->val >= 10){
flag = 1;
tmp->val -= 10;
}else{
flag = 0;
}
l1 = l1->next;
}
else if(NULL == l1 && NULL != l2){
tmp->val = l2->val + flag;
if(tmp->val >= 10){
flag = 1;
tmp->val -= 10;
}else{
flag = 0;
}
l2 = l2->next;
}
else{
tmp->val = 1;
flag = 0;
}
}
return res;
}