力扣算法篇:两数之和
两数之和:给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字0之外,这两个数都不会以0开头。
实例:
题解:遍历两个链表 将各位相加 同时注意进位
/**
* Definition for singly-linked list.
单链表的定义:
* struct ListNode {
* int val;
* ListNode *next;
*构造函数:
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
//用两个结构体指针变量来遍历链表
//将和保存在原有的l2链表中
ListNode *p1 = l1;
ListNode *p2 = l2;
//使用一个链表保存结果值
ListNode *result = nullptr;
//使用一个指针变量指示位置
ListNode * curent = nullptr;
//临时变量保存进位的值
int add = 0;
//两数相加 遍历两个链表
while(p1 || p2 ){
int x = p1?p1->val:0;
int y = p2?p2->val:0;
int temp = add + x + y;
if(!result){
//如果是结果链表的第一个元素
result = curent = new ListNode(temp%10);
}else{
curent->next = new ListNode(temp%10);
curent = curent->next;
}
//进位值
add = temp/10;
//移动指针
p1 = p1==nullptr?nullptr:p1->next;
p2 = p2==nullptr?nullptr:p2->next;
}
//最后一位相加完仍有进位 需要增加一个结点
if(add>0){
curent->next = new ListNode(add);
}
return result;
}
};