题目:
给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
因为链表按照逆序储存,因此可以 让链表依次相加,然后考虑每次的进位情况就可以了。若两个链表长度不一,可先计算长度相同的部分,最后直接加上剩余的链表。
先建立一个空链表,头指针不动,尾指针不断生成下一个节点,依次储存 两个链表相同位置的和,最后加上长链表的剩余部分。
申请动态链表:
struct ListNode* head=(struct ListNode*)malloc(sizeof(struct ListNode));
判断剩余部分:并将剩余链表赋予 l1;
l1=l1 ? l1:l2;
最后再释放链表头指针。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
int carry=0; //设置进位
struct ListNode* head=(struct ListNode*)malloc(sizeof(struct ListNode)),*tail=head;
while(l1 && l2) //l1和l2 共同部分 求和
{
int sum=l1->val+l2->val+carry;
if(sum>9)
{
sum-=10;
carry=1;
}
else
{
carry=0;
}
tail->next=(struct ListNode*)malloc(sizeof(struct ListNode));
tail=tail->next;
tail->val=sum;
l1=l1->next;
l2=l2->next;
}
//剩余部分 求和
l1=l1 ? l1:l2;
for(;l1;l1=l1->next)
{
int sum=l1->val+carry;
if(sum>9)
{
sum-=10;
carry=1;
}
else
{
carry=0;
}
tail->next=(struct ListNode*)malloc(sizeof(struct ListNode));
tail=tail->next;
tail->val=sum;
}
if(carry) //考虑最后的进位情况
{
tail->next=(struct ListNode*)malloc(sizeof(struct ListNode));
tail=tail->next;
tail->val=1;
}
tail->next=NULL; //链表收尾
tail=head;
head=head->next;
free(tail); // 释放头指针,返回第二个指针
return head;
}
有部分代码参考其他人的,请见谅。
![可怜](https://static-blog.csdn.net/xheditor/xheditor_emot/default/cute.gif)
![可怜](https://static-blog.csdn.net/xheditor/xheditor_emot/default/cute.gif)