题目来源
本题来源为:
题目描述:
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
题目解析
分析题目:就是两个数相加的过程,只是换成了在链表中进行加减操作。
例如下面这个例子:
注意:因为传的是逆序。而加法操作正好是从低位开始,所以逆序会方便我们的操作。最后要将结果变成逆序输出即可。
算法原理
本题的算法原理很简单,其实就是模拟一下两数相加的过程。
首先为了方便,我们先定义一个虚拟头节点。
其次定义两个指针分别指向两个链表的头节点,定义一个新的变量t来进行一个进位操作,然后模拟两数相加的过程。
注意:计算结果保存在t变量中,是将这个结果的个位放在链表中。
代码实现
/** * 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) { ListNode*cur1=l1; ListNode*cur2=l2; //创建一个虚拟头节点,记录最终结果 ListNode*newnode =new ListNode(0); ListNode*prev=newnode;//尾指针 int t=0;//记录进位 while(cur1||cur2||t) { //先加第一个链表 if(cur1) { t+=cur1->val; cur1=cur1->next; } //加上第二个来链表 if(cur2) { t+=cur2->val; cur2=cur2->next; } //将各位保存在链表中 prev->next=new ListNode(t%10); prev=prev->next; t/=10; } prev=newnode->next; delete newnode; return prev; } };