leetcode链表第二题 :两数相加

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

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

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

示例:

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

解题思路和考虑的问题:
思路:设两个工作指针同时移动相加,把值保存在新结点中
问题:
1、进位问题:
设一个count记录进位,由于加法进位最多为1,判断有进位后直接count=1,else count=0;
2、俩个数位数不相等,列:677和87:
在第一次循环后判断哪个数为高位数,再同count相加如新链表
3、两个数所有位数处理完后,还需判断有无进位,列545+555=1000:

代码:

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

typedef struct ListNode LNode;
typedef LNode* List;
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    if(l1==NULL||l2==NULL)          
        return NULL;
    List head=NULL,p,tempNode;          //p为新链表尾插的工作指针,tempNode为建立节点的指针
    LNode *p1=l1,*p2=l2;                //相加的工作指针
    int tempval,count=0;                //tempval保存新节点的值  count表进位
    
    while(p1!=NULL&&p2!=NULL){
        tempval=count+p1->val+p2->val;
        if(tempval>=10){                //判断是否有进位
            count=1;
            tempval=tempval%10;
        }
        else
            count=0;
        tempNode=(List)malloc(sizeof(LNode));
        tempNode->val=tempval;
        if(head==NULL){                 //无头结点的尾插法第一次插入略有不同
            head=tempNode;
            p=tempNode;
        }
        else{
            p->next=tempNode;
            p=p->next;
        }
        p1=p1->next;
        p2=p2->next;
    }
    
    while(p1!=NULL){            //当l1位数比l2高
        tempval=count+p1->val;
        if(tempval>=10){
            count=1;
            tempval=tempval%10;
        }
        else{
            count=0;
        }
        tempNode=(List)malloc(sizeof(LNode));
        tempNode->val=tempval;
        p->next=tempNode;
        p=p->next;
        p1=p1->next;
    }

    while(p2!=NULL){            //当l2位数比l1高
        tempval=count+p2->val;
        if(tempval>=10){
            count=1;
            tempval=tempval%10;
        }
        else{
            count=0;
        }
        tempNode=(List)malloc(sizeof(LNode));
        tempNode->val=tempval;
        p->next=tempNode;
        p=p->next;
        p2=p2->next;
    }

    if(count!=0){               //当最后一位有进位
        tempNode=(List)malloc(sizeof(LNode));
        tempNode->val=count;
        p->next=tempNode;
        p=p->next;
    }
    p->next=NULL;                //尾部置空
    return head;
}
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值