LeetCode题目:2. Add Two Numbers
原题链接:https://leetcode.com/problems/add-two-numbers/description/
解题思路:
核心思想:
将链表看成十进制数,同时递归两个链表,对相同的位置的数进行相加,然后得到进位,进位加到下一位数。
代码细节:
1.为了不改变输入链表,新建一个链表作为输出,并新建一个指针用于新建链表的递归。
2.add表示进位,每位的进位只能是0或者1其中一个
3.新建链表创造新节点的时候需要申请内存空间
坑点:
1.输出链表的头结点可能为0,即0+0=0
2.当短链表递归结束的时候,长链表仍然可能需要继续递归,因为可能有进位的存在,如:1+1999
3.可能产生一个新的进位,即新节点,如:50+50
代码:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int add; // 下一位的加值,0/1
ListNode* returnListHead; // 返回的链表头
ListNode* returnTemp; // 用于遍历返回的链表
ListNode* temp; // 遍历用节点,遍历两条链表中较长那条
// 因为第一个值确定,可以直接进行初始化
returnListHead = new ListNode((l1->val + l2->val) % 10);
returnTemp = returnListHead;
add = (l1->val + l2->val) / 10;
// 不断循环相加
while (1) {
l1 = l1->next;
l2 = l2->next;
if (l1 == NULL) {
temp = l2;
break;
}
if (l2 == NULL) {
temp = l1;
break;
}
// 链表添加,add修改值
returnTemp->next = new ListNode((l1->val + l2->val + add) % 10);
add = (l1->val + l2->val + add) / 10;
returnTemp = returnTemp->next;
}
while (temp != NULL) {
// 链表添加,add修改值
returnTemp->next = new ListNode((temp->val + add) % 10);
add = (temp->val + add) / 10;
returnTemp = returnTemp->next;
temp = temp->next;
}
// 若最后还有一个进位,链表加上进位
if (add == 1)
returnTemp->next = new ListNode(1);
return returnListHead;
}