LeetCode 2. 两数相加 | C语言版
NowCoder Offer 2. 两数相加
题目描述
题目地址:2. 两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
解题思路
思路一:使用栈
代码实现
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
//链表反转
struct ListNode* reverseList(struct ListNode* head){
//当前节点
struct ListNode* cur=head;
//当前节点的前驱节点
struct ListNode* prev=NULL;
//当前节点的下一节点
struct ListNode* temp;
while(cur){
//保存当前节点的下一个节点,防止断链
temp=cur->next;
//反转链表(改变当前节点cur指针指向)
cur->next=prev;
//更新prev和cur节点(向右移动)
prev=cur;
cur=temp;
}
return prev;
}
//链表相加
struct ListNode* addReversed(struct ListNode* head1,struct ListNode* head2){
//设置哨兵节点dummy
struct ListNode* dummy=(struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* sumNode=dummy;
//记录进位
int carry=0;
while(head1!=NULL || head2!=NULL){
//对齐的上下节点相加
int sum=(head1==NULL ? 0:head1->val)+(head2==NULL ?0:head2->val)+carry;
//计算进位
carry=sum>=10 ? 1:0;
sum=sum>=10 ? sum-10:sum;
//计算出新增节点
struct ListNode* newNode=(struct ListNode*)malloc(sizeof(struct ListNode));
newNode->val=sum;
sumNode->next=newNode;
sumNode=sumNode->next;
head1=head1==NULL ? NULL:head1->next;
head2=head2==NULL ? NULL:head2->next;
}
//所有位相加完后还余有进位,就作为一个新节点添加进来
if(carry>0){
sumNode->next=(struct ListNode*)malloc(sizeof(struct ListNode));
sumNode->val=carry;
}
return dummy->next;
}
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
//1.先把两个表示整数的链表反转
reverseList(l1);
reverseList(l2);
//2. 从两个链表的头结点开始相加(相当于从整数的个位数开始相加)
struct ListNode* reversedHead=addReversed(l1,l2);
//3.最后把表示和的链表反转
return reverseList(reversedHead);
}
运行结果
参考文章:
思路二:减少遍历节点数
代码实现
在这里插入代码片