力扣练习题----两数相加

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

/**

  • Definition for singly-linked list.
  • struct ListNode {
  • int val;
    
  • struct ListNode *next;
    
  • };
    */

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{

//初始化空头
struct ListNode* head = (struct ListNode*)malloc(sizeof(struct ListNode));
head->next =NULL;
struct ListNode* tail;
tail = head;
struct ListNode* p1 = l1;
struct ListNode* p2 = l2;

int tmp = 0; //进位

//循环,直到跳出两个链表
//当两条链表一样长时只需这一次处理,但是当不一样长时,只能处理一样长的大小
while (p1 != NULL && p2 != NULL)
{
	//当前结点的和,注意加上进位
	int sum = p1->val + p2->val + tmp;
	//当前结点和大于等于10时
	if (sum >= 10)
	{
		sum -= 10;   //当前结点的值-10,变为个位
		tmp = 1;     //大于10,进位1
	}
	else
	{
		tmp = 0;
	}

	//初始化结点,尾添加, 必须先将尾指针移动到新的尾结点上再赋值,因为不这么做的话,第一个结点无法正确赋值(因为这时候尾指针还没有真正移到第一个结点上,此时指向的还是头结点)
	tail->next = (struct ListNode*)malloc(sizeof(struct ListNode));
	tail = tail->next;
	tail->val = sum;
	

	p1 = p1->next;
	p2 = p2->next;
}

//当两条链表不一样长时,其中一者为NULL了,另一者还没完,这时候用p1指向没完的那一条链表,继续遍历
if (p1 == NULL)
{
	p1 = p2;
}
else 
{
	p1 = p1;
}

//遍历剩余部分
while (p1 != NULL)
{
	int sum = p1->val + tmp; //带上进制计算当前结点和

	if (sum >= 10)
	{
		sum -= 10;
		tmp = 1;
	}
	else
	{
		tmp = 0;
	}
	//继续朝合并的链表中添加结点
	tail->next = (struct ListNode*)malloc(sizeof(struct ListNode));
	tail = tail->next;
	tail->val = sum;
	

	p1 = p1->next;

}

//如果最后一位还有进制,再申请一个结点存1
if (tmp == 1)
{
	tail->next = (struct ListNode*)malloc(sizeof(struct ListNode));
	tail = tail->next;
	tail->val = 1;
	
}

tail->next = NULL; //尾指针赋空,结尾

//因为我们不能返回头结点,所以要把头结点释放了,但是要头指针移到第一个结点
struct ListNode* ptr = head;
head = head->next;
free(ptr);

return head;

}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值