原题链接
解题思路:
本题可以使用模拟法,从链表的结点中提取出val逐个相加,没有值取0。并且记录进位,每个节点只保留个位数,所以需要使用sum与10取模,如果最高位存在进位则需要在最后添加一个val为1的节点,从而得到最后的结果链表。
/*** 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 *res = new ListNode(-1); //添加虚拟头结点,简化边界情况的判断ListNode *cur = res;int carry = 0; //表示进位while (l1 || l2) {int n1 = l1 ? l1->val : 0;int n2 = l2 ? l2->val : 0;int sum = n1 + n2 + carry;carry = sum / 10;cur->next = new ListNode(sum % 10);cur = cur->next;if (l1) l1 = l1->next;if (l2) l2 = l2->next;}if (carry) cur->next = new ListNode(1); //如果最高位有进位,则需在最前面补1.return res->next; //返回真正的头结点}
};