题目:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
思路: 因为这个题必须使用链表来写,思路并不难,主要就是要熟悉链表和指针,然后就可以好好复习一下链表了,这些基础知识我真是完全不记得了,完全是写给智障的自己看的,问了大佬很多弱智的问题鸭。我就是要全部记下来,怕自己三天以后又忘了。
1. 链表的操作很棒的一个链接 :https://www.cnblogs.com/byonecry/p/4458821.html.
2. 首先分析这个题,链表1,链表2。如果长度一样,就要直接相加,然后考虑进位的问题,如果长度不一样,短的链表该位赋为0.
3.1 结构体中 定义 *next 是指向下一个结构体的指针;
3.2 c++中 定义一个结构体变量的方法 : ListNode phead (0), *p = &phead ;现在的phead是一个空的头指针,必须定义一个结构体指针取其地址
3.3 指针访问结构体 用p-> ,变量访问结构体元素 用 phead.next
3.4 p->next = new ListNode(sum%10); p=p->next; 这个为链表的常规操作,生成一个新的节点,并将其连接起来;
3.5 至于为什么是返回 phead.next,因为以上的操作已经生成了一个完整的链表,ListNode *next 里面依旧可以指向一个*next
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode phead (0), *p = &phead;
int sum=0;
int a=0; //进位
while(l1||l2||a){ //全部为0, 才能停止循环
int sum=(l1 ? l1->val : 0)+(l2 ? l2->val : 0)+a; //这个表示真的好棒
a=sum/10;
p->next = new ListNode(sum%10);
p=p->next;
l1=l1 ? l1->next : l1;
l2=l2 ? l2->next : l2;
}
return phead.next;
}
};