0002 两数相加
题目链接:https://leetcode-cn.com/problems/add-two-numbers/
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
解法
1. C语言版
// 两个链表节点相加,修改进位标志,注意节点为空
int add(struct ListNode* p1, struct ListNode* p2, int *flag) {
int value = (p1 ? p1->val : 0) + (p2 ? p2->val : 0) + *flag;
*flag = 0;
if (value > 9)
{
*flag = 1;
value -= 10;
}
return value;
}
// 向链表插入结果
void insert(struct ListNode* list, int val)
{
struct ListNode* tmp = (struct ListNode*)malloc(sizeof(struct ListNode));
tmp->next = NULL;
tmp->val = val;
struct ListNode* end = list->val == 0 ? list: (void *)(list->val); // 得到链表的末尾节点
end->next = tmp;
list->val = tmp;
}
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
struct ListNode root; // 链表根节点root
root.next = NULL; // root.next是结果的头结点
root.val = 0; // root.val用来存放链表末尾节点的地址
int flag = 0; // 进位标志位
while (l1 || l2 || flag)
{
insert(&root, add(l1, l2, &flag));
l1 = l1 ? l1->next : NULL;
l2 = l2 ? l2->next : NULL;
}
return root.next;
}
2.Java版
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode head = new ListNode(0);
ListNode ans = head;
int flag = 0;
int num1;
int num2;
int result;
while (l1 != null || l2 != null || flag == 1) {
num1 = l1 == null ? 0 : l1.val;
num2 = l2 == null ? 0 : l2.val;
result = num1 + num2 + flag;
if (result / 10 > 0) flag = 1;
else flag = 0;
ans.next = new ListNode(result % 10);
l1 = l1 == null ? null : l1.next;
l2 = l2 == null ? null : l2.next;
ans = ans.next;
}
return head.next;
}