第二题:两数相加
- 给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字
- 请你将两个数相加,并以相同形式返回一个表示和的链表
- 你可以假设除了数字 0 之外,这两个数都不会以 0 开头
示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
示例 2:
- 输入:l1 = [0], l2 = [0]
- 输出:[0]
示例 3:
- 输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
- 输出:[8,9,9,9,0,0,0,1]
提示:
- 每个链表中的节点数在范围
[1, 100]
内 0 <= Node.val <= 9
- 题目数据保证列表表示的数字不含前导零
解题:
/**
* @file 2.cpp
* @author HarkerYX
* @brief 两数相加
* @version 0.1
* @date 2021-04-26
*
* @copyright Copyright (c) 2021
*
*/
/*
第二题:两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字
请你将两个数相加,并以相同形式返回一个表示和的链表
你可以假设除了数字 0 之外,这两个数都不会以 0 开头
*/
#include <stdio.h>
#include <windows.h>
struct ListNode {
int val;
struct ListNode * next;
};
void printListNode(struct ListNode* p)
{
struct ListNode* q = p;
printf("[");
while(q!=NULL)
{
printf("%d,",q->val);
q = q->next;
}
printf("]\n");
}
struct ListNode * createTwoListNode(int num)
{
struct ListNode *p1 = NULL;
struct ListNode *t1 = NULL;
struct ListNode *q = NULL;
int tmp;
if(num==0)
{
q = (struct ListNode *)malloc(sizeof(ListNode) * 1);
q->val = num;
q->next = NULL;
p1 = q;
return p1;
}
while(num!=0){
tmp = num % 10;
num /= 10;
q = (struct ListNode *)malloc(sizeof(ListNode) * 1);
q->val = tmp;
q->next = NULL;
if(p1==NULL){
t1 = p1 = q;
q->next = NULL;
}
else{
t1->next = q;
q->next = NULL;
t1 = q;
}
}
//printListNode(p1);
return p1;
}
/**
* @brief
*
* @param l1 第一个数字的链表
* @param l2 第二个数字的链表
* @return struct ListNode* 返回结果链表
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode *p = l1, *q = l2;
struct ListNode *ret = NULL;
struct ListNode *ret_tmp = NULL;
struct ListNode *tmp = NULL;
bool flag = 0;
int n1, n2;
while(p!=NULL || q!=NULL)
{
n1 = (p!= NULL) ? p->val : 0;
n2 = (q!= NULL) ? q->val : 0;
int sum = n1 + n2 + flag;
flag = sum / 10;
tmp = (struct ListNode *)malloc(sizeof(struct ListNode) *1);
tmp->val = sum % 10;
tmp->next = NULL;
if(ret==NULL)
ret_tmp = ret = tmp;
else{
ret_tmp->next = tmp;
ret_tmp = tmp;
}
if(p!= NULL)
p = p->next;
if(q!= NULL)
q = q->next;
}
//处理最后如果有进位
if(flag>0)
{
tmp = (struct ListNode *)malloc(sizeof(struct ListNode) *1);
tmp->val = flag;
tmp->next = NULL;
ret_tmp->next = tmp;
}
printListNode(ret);
return ret;
}
int main(void)
{
// int num1 = 0;
// int num2 = 0;
// int num1 = 342;
// int num2 = 465;
// 9999999 和 9999 两个非负数
int num1 = 9999999;
int num2 = 9999;
struct ListNode *ln1 = NULL;
struct ListNode *ln2 = NULL;
struct ListNode *ret = NULL;
ln1 = createTwoListNode(num1);
ln2 = createTwoListNode(num2);
ret = addTwoNumbers(ln1, ln2);
return 0;
}
[8,9,9,9,0,0,0,1,]