leetcode2:两数相加

分析:求两个链表相加的和,运算从低到高,即从头节点开始向后运算。所需考虑的是当前两个链表是否已经遍历完成,以及当前是否需要进位。

步骤:

  1. 1.设置两个指针分别指向l1和l2的头节点
    2.开一个新链表,维护一个指向新链表的尾指针
    3.插入节点:
    • a.从l1和l2中选出两个节点
      -b.算出当前节点的值
      -c.判断是否需要进位(当前节点是否大于10)
      -d.建立节点,连接到新链表中
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    //设置哨兵prehead
    struct ListNode* prehead=(struct ListNode*)malloc(sizeof(struct ListNode));
    prehead->val=0;
    prehead->next=NULL;
    //维护指向新链表的尾指针
    struct ListNode* tail=prehead;

    //carry表示前一次相加后是否进位,大于10,carry为1,小于10为0,
    int carry=0;
    //l1和l2不为空,且无需进位,跳出循环
    while(l1||l2||carry){
        //在l1链表中选择一个值
        int nl1=(l1)?l1->val:0;
        //在l2链表中选值
        int nl2=(l2)?l2->val:0;
        //当前的和为l1和l2的值再加上carry
        int sum=nl1+nl2+carry;
        //是否大于10,大于0,则需要进位
        carry=sum/10;
        //当前节点的值
        int val=sum%10;

        struct  ListNode* node=(struct ListNode*)malloc(sizeof(struct ListNode));
        node->val=val;
        node->next=NULL;
        tail->next=node;
        tail=node;

        //防止l1和l2为空指针
        if(l1)
            l1=l1->next;
        if(l2)
            l2=l2->next;
    }
    l1=prehead->next;
    free(prehead);

    return l1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值