leetcode力扣 2 两数相加 链表

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例图如下图所示:

定义struct结构体存放指针域和指针next;

需要注意以下几点:

1 将长度较短的链表在末尾补零使得两个连表长度相等,再一个一个元素对其相加(考虑进位)
2 获取两个链表所对应的长度
3 在较短的链表末尾补零
4 对齐相加考虑进位

定义头尾部结点置为空。定义int型变量carry用来存储进位值。

使两个链表不为空为循环条件,将变量n1 n2以两条链表头节点为值,进行求和sum,如果头节点为零,则开辟一个空间,尾部值使它是总和的余数,并将next域置空;

如果头节点不为零,则开辟空间给tail-next的值赋值为余数,并且tail指向tail->next,carry的值赋值为sum除10,遍历l1 l2两条链表。

第一轮循环:

head=tail=NULL;

l1 分别为2 4 3

l2 分别为5 6 4

n1=2;   n2=5;    sum=7;    tail->val=7;   carry=7/10=0;      

第二轮循环:

n1=4;   n2=6;   sum=10;   tail->next->val=0;  carry=1;

第三轮循环:

n1=3;   n2=4;   sum=7+1=8;    tail->next->val=8;   carry=0;

打印输出,tail->val的值并由他指向next分别输出7 0 8;

#include <stdio.h>
#include <malloc.h>
struct ListNode {
     int val;
     struct ListNode *next;
};
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    struct ListNode*head=NULL,*tail=NULL;
    int carry=0;
    while(l1||l2){
        int n1=l1?l1->val:0;
        int n2=l2?l2->val:0;
        int sum=n1+n2+carry;
        if(!head){
            head=tail=malloc(sizeof(struct ListNode));
            tail->val=sum%10;
            tail->next=NULL;
        }
        else{
            tail->next=malloc(sizeof(struct ListNode));
            tail->next->val=sum%10;
            tail=tail->next;
            tail->next=NULL;
        }
        carry=sum/10;
        if(l1){
            l1=l1->next;
        }
        if(l2){
            l2=l2->next;
        }
    }
    if(carry>0){
        tail->next=malloc(sizeof(struct ListNode));
        tail->next->val=carry;
        tail->next->next=NULL;
    }
    return head;

}
int main() {
    struct ListNode* node1= malloc(sizeof (struct ListNode));
    struct ListNode* node2= malloc(sizeof (struct ListNode));
    struct ListNode* node3= malloc(sizeof (struct ListNode));
    struct ListNode* node4= malloc(sizeof (struct ListNode));
    struct ListNode* node5= malloc(sizeof (struct ListNode));
    struct ListNode* node6= malloc(sizeof (struct ListNode));
    node1->val=2;
    node2->val=4;
    node3->val=3;
    node4->val=5;
    node5->val=6;
    node6->val=4;
    node1->next=node2;
    node2->next=node3;
    node3->next=NULL;

    node4->next=node5;
    node5->next=node6;
    node6->next=NULL;
    struct ListNode* newhead= addTwoNumbers(node1,node4);
    while (newhead){
        printf("%d ",newhead->val);
        newhead=newhead->next;
    }

    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值