零、题目
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头
/**
- Definition for singly-linked list.
- struct ListNode {
-
int val;
-
struct ListNode *next;
- };
*/
一、阅读题目
1 已知量:加法的两个元素;
2 未知量:加法的结果;
3 条件:加法;
二、拟定方案
1 获取加法中,每一位的分开的元素;
2 进位;
3 获取每个节点的值;
4 插入节点,尾部插入;
三、code
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode* head = (struct ListNode*)malloc(sizeof(struct ListNode));
head->next = NULL;
struct ListNode* tail = head;
int carry = 0;
int l1Val;
int l2Val;
while(l1 != NULL || l2 != NULL || carry!=0)
{
if(l1 == NULL)
{
l1Val = 0;
}else
{
l1Val = l1->val;
}
if(l2 == NULL)
{
l2Val = 0;
}else
{
l2Val = l2->val;
}
int sum = l1Val +l2Val + carry;
carry = sum/10;
struct ListNode* sumNode = (struct ListNode*)malloc(sizeof(struct ListNode));
sumNode->val = sum%10;
sumNode->next = NULL;
tail->next = sumNode;
tail = sumNode;
if(l1 != NULL) l1 = l1->next;
if(l2 != NULL) l2 = l2->next;
}
return head->next;
}
四、回顾
1 这里的尾部插入,与上一个题中的尾部插入不一样
1) 将当前节点的next值,赋值给新创建的节点,然后再将本节点给加上;
2)生成本节点信息,将该节点信息赋值给链表中最后一个节点,然后再将链表中最后一个指针更新为当前节点;
3)区别有两点,第一是是否继承了上一次链表中,最后一个节点的next值,为空或者为零;选择为零的原因是,此处使用数组模拟链表,初始化的表示下一个值得数组,默认值都为零;
2 当前遇到两种题型,第一是在什么位置插入该节点,第二个是顺序插入,但是插入什么样的节点;
3 一般情况都是尾部插入的方式,以及第一个节点为空;