基本思路:分别从左到右遍历两个链表,对应数字相加,相加得到的和若大于10则产生进位,进位加到下一次运算中,用sum/10得到进位,sum%10得到本位,本位作为当前运算结果添加到新链表末尾
为了将长度不等的链表和长度相等的链表两种情况结合起来,在一个循环中做判断:如果两个当前指针都不为NULL,则获取对应数字;如果其中一个指针为NULL,也即遍历到了末尾,则在接下来的运算中该链表数字始终置为0。
然后将两个数字和上一次运算产生的进位相加得到sum,用sum/10得到进位,sum%10得到本位,本位作为当前运算结果添加到新链表末尾。
当两个链表都遍历完了退出循环。
若最后一次运算产生进位,那么这个进位单独成为新节点连接到result链表末尾。
//struct ListNode {
// int val;
// ListNode *next;
// ListNode(int x) : val(x), next(NULL) {}
//
//};
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode *l1iter = l1;
ListNode *l2iter = l2;
ListNode *result = new ListNode(0);
ListNode *m = result;
int jinwei = 0;
while (1){
int p;
int q;
//若其中一个链表遍历完了,将对应数字置为0
if (l1iter != NULL)
{
p = l1iter->val;
l1iter = l1iter->next;
}
else
p = 0;
if (l2iter != NULL)
{
q = l2iter->val;
l2iter = l2iter->next;
}
else
q = 0;
int sum = p + q + jinwei; //将对应两个数和进位相加
int benwei = sum % 10; //判断和是否大于10,余数为本位
ListNode *newnode = new ListNode(benwei); //增加一个新节点连接到result链表末尾
m->next = newnode;
m = m->next;
jinwei = sum / 10; //商为进位(若无进位则为0)
if (l1iter == NULL&&l2iter == NULL) //当两个链表都遍历完了跳出循环
break;
}
if (l1iter == NULL&&l2iter == NULL){
//若最后一次运算产生进位,那么这个进位单独成为新节点连接到result链表末尾
if (jinwei != 0){
ListNode *newnode = NULL;
newnode = new ListNode(jinwei);
m->next = newnode;
}
}
return result->next;
}
};