给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
/** * 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) { if(l1==NULL && l2==NULL) { return NULL; } int jinwei = 0; //表示每次的进位 ListNode* p1 = l1, * p2 = l2; queue<int>s; // 使用队列暂时保存对应位相加的和 while(p1 && p2) //两个链表的对应位都不为空 { int value = p1->val + p2->val + jinwei; if(value >= 10) { jinwei = 1; s.push(value % 10); } else { jinwei = 0; s.push(value); } p1 = p1->next; p2 = p2->next; } bool flag1 = false, flag2 = false; if(p1!=NULL) // 第一个链表较长 { flag1 = true; while(p1) { int value = p1->val + jinwei; if(value >= 10) { jinwei = 1; s.push(value % 10); } else { jinwei = 0; s.push(value); } p1 = p1->next; } } if(p2!=NULL) //第二个链表较长 { flag2 = true; while(p2) { int value = p2->val + jinwei; if(value >= 10) { jinwei = 1; s.push(value % 10); } else { jinwei = 0; s.push(value); } p2 = p2->next; } } if(jinwei > 0) // 如果最高位有进位,则新增一位 1 s.push(jinwei); //利用现有的链表,不用重新开辟一个新链表了 if(flag1 == true) //链表1 比较长 p1 = l1; else p1 = l2; l1 = p1; l2 = p1; while(p1!=NULL) { int a = s.front(); p1->val = a; s.pop(); l2 = p1; p1 = p1->next; } if(!s.empty()) //最高位有进位,则新开辟一个节点,并接到链表后面 { ListNode * q = new ListNode(0); q->val = s.front(); l2->next = q; } return l1; } };