题意
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
样例
样例1
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
样例2
输入:l1 = [0], l2 = [0]
输出:[0]
样例3
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
思路
这题,不算很难,但是有坑,很容易就绕进去了,至少我是哈~
长度不够的位数直接补零
1.首先判断l1和l2的长度,不够的长度后面补零
2.在位相加的时候,要判断进位
3.新开一个链表,存储答案
总结
1.注意 p->next != NULL 和p != NULL的区别
2.定义的新链表 new ListNode
3.注意逻辑和代码的衔接
代码
/**
* 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) {
int le1 = 1;//l1的长度
int le2 = 1;//l2的长度
ListNode *p = l1;
ListNode *q = l2;
//计算长度
while (p->next != NULL){
le1 ++;
p=p->next;
}
while (q->next != NULL){
le2 ++;
q = q->next;
}
//长度不够互相补0
if (le1 > le2){
for (int i = 1;i <= le1-le2;i ++){
q->next = new ListNode(0);
q = q->next;
}
} else {
for (int i = 1;i <= le2-le1;i ++){
p->next = new ListNode(0);
p = p->next;
}
}
//增加一个记录相加的链表
p = l1;
q = l2;
ListNode *l3 = new ListNode(-1);
//考虑进位的标记节点
bool flag = false;//默认没有进位
//移动的指针
ListNode *t = l3;
int count = 0;v
while (p != NULL && q != NULL){
count = flag + p->val + q->val;
t->next= new ListNode(count%10);
flag = count >= 10?true:false;
t = t->next;
p = p->next;
q = q->next;
}
if (flag){
t->next = new ListNode(1);
t = t->next;
}
return l3->next;
}
};