给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。

/**
 * Definition for singly-linked list.
 * 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)
    {
        //当链表长度不同时,短的那个链表后面默认为0
        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;

}

 

posted @ 2023-10-24 21:07  44556677  阅读(157)  评论(0)    收藏  举报