知识点
链表相加一、问题描述
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
实例:
2->4->3
5->6->4
结果输出:
8->0->7
解释:342+465=807
二、算法思想
解题思路很明显,就是两个逆序链表的相加。三、难点
1、进位的处理
设置变量t,利用t来记录两个链表对应位置上面的和
2、设置虚拟头节点
由于用链表表示数字,数字的相加从最低位开始计算。链表逆序,刚好直接可以进行相加。
设置虚拟头节点。
四、算法实现
代码如下:
/**
* 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) {
//用变量t来记录进位 因此和的每一个位数上面的数字都需要计算三个数
//从各位开始循环 直到做到没有数字并且进位为0
//定义一个虚拟头节点 凡是需要特别判断头节点的时候 加一个头节点 不需要就可以不加
auto dummy = new ListNode(-1) ,cur = dummy;
int t = 0;
while(l1 || l2 || t){
if(l1) t += l1->val , l1 = l1 -> next;
if(l2) t += l2 ->val , l2 = l2 ->next;
cur = cur -> next = new ListNode(t % 10);
t /= 10;
}
//虚拟头节点的next才是真正的和的链表
return dummy->next;
}
};