给定两个非空链表来代表两个非负数,位数按照逆序方式存储,它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807
/** * 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) { ListNode *ans = new ListNode(0); //答案串 ListNode *head = ans;//记录一下答案串的首地址 int pos = 0; //标记进位 while (l1 && l2) {//现将相同的位置加上 int cnt = l1 -> val + l2 -> val + pos; pos = cnt > 9 ? 1 : 0; ans -> val = cnt % 10; l1 = l1 -> next; l2 = l2 -> next; if (l1 && l2) { ans -> next = new ListNode(0); ans = ans -> next; } else { break; } } // 然后处理后边的数此时ans不是空的,而是指向最后一个节点 if (l1 == NULL && l2 == NULL) {//加完了 if (pos) { ans -> next = new ListNode(0); ans = ans -> next; ans -> val = pos; } } else if (l1 == NULL) {//第一个链表用完了 while (l2) {//用完 ans -> next = new ListNode(0); ans = ans -> next; int cnt = l2 -> val + pos; pos = cnt > 9 ? 1 : 0; ans -> val = cnt % 10; l2 = l2 -> next; } if (pos) { ans -> next = new ListNode(0); ans = ans -> next; ans -> val = pos; } } else if (l2 == NULL) { while (l1) {//用完 ans -> next = new ListNode(0); ans = ans -> next; int cnt = l1 -> val + pos; pos = cnt > 9 ? 1 : 0; ans -> val = cnt % 10; l1 = l1 -> next; } if (pos) { ans -> next = new ListNode(0); ans = ans -> next; ans -> val = pos; } } ans = head; return ans; } };