【力扣题解】2、两数相加
题目描述: 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
来源: 力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
参考示例:
**解题结果: **
解题思路: 类似数电里的串行进位加法器原理,从低位逐位加到高位,每一位相加后产生和与进位,将和的个位数当作最后结果在该位的数字,十位数即为进位,参与下一位的相加运算。
**代码: **
class Solution {
public:
int getLength(ListNode* L) {//获取链表的长度
ListNode* p;
int length = 0;
p = L;
while (p) {
length++;
p = p->next;
}
return length;
}
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int length_1, length_2, length;
int sum, advance = 0;
ListNode* p, * q, * L, * head;
ListNode* temp;
length_1 = getLength(l1);
length_2 = getLength(l2);
if (length_1 >= length_2) {//找到长度最长的表作为基表
L = l1;
head = l1;
length = length_1;
}
else {
L = l2;
head = l2;
length = length_2;
}
p = l1;
q = l2;
while (p && q) {
sum = p->val + q->val + advance;
L->val = sum % 10;
advance = sum / 10;
L = L->next;
p = p->next;
q = q->next;
}
while (advance > 0 && L) {
sum = L->val + advance;
L->val = sum % 10;
advance = sum / 10;
L = L->next;
}
if (advance > 0) {//最终结果链表的长度都大于两个加数链表的长度的情况
temp = new ListNode;
temp->val = advance;
temp->next = NULL;
while (head->next) {
head = head->next;
}
head->next = temp;
}
if (length_1 >= length_2) { return l1; }
else { return l2; }
}
};