LEETCODE(力扣) 2. 两数相加(c语言实现)

  1. 两数相加

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

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

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

示例 1:

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
示例 2:

输入:l1 = [0], l2 = [0]
输出:[0]
示例 3:

输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

提示:

每个链表中的节点数在范围 [1, 100] 内
0 <= Node.val <= 9
题目数据保证列表表示的数字不含前导零

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

struct ListNode jinwei;//用于最后进位,添加一个节点

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
    int a=0;
    struct ListNode *p1,*p2;
    p1=l1;
    p2=l2;
    while(p1->next!=NULL&&p2->next!=NULL)//遍历相加到某一结点结束
    {
        if(a)
        {
            p1->val=p1->val+p2->val+a;
            a=0;
            if(p1->val>=10)
            {
                p1->val=p1->val%10;
                a=1;
            }
            p2->val=p1->val;
            p1=p1->next;
            p2=p2->next;
            continue;
        }
        p1->val=p1->val+p2->val;
        if(p1->val>=10)
        {
            p1->val=p1->val%10;
            a=1;
        }
        p2->val=p1->val;
        p1=p1->next;
        p2=p2->next;


    }
   //l1空,l2仍有节点
    if(p1->next==NULL&&p2->next!=NULL)
    {
        p2->val=p1->val+p2->val+a;
        if(p2->val>=10)
        {
            p2->val=p2->val%10;
            a=1;
        }
        else
        {
            a=0;
        }
        p2=p2->next;
        while(a)
        {
            p2->val=p2->val+a;
            if(p2->val>=10)
            {
                p2->val=p2->val%10;
                a=1;
            }
            else
            {
                a=0;
            }
            if(p2->next!=NULL)
            {
                p2=p2->next;
            }
            else
            {
                if(a)
                {
                    p2->next=&jinwei;
                    jinwei.val=1;
                    jinwei.next=NULL;
                    a=0;
                }
                
            }
        }
        return l2;
    }
    else if(p2->next==NULL&&p1->next!=NULL) //l2空,l1仍有节点
    {
        p1->val=p2->val+p1->val+a;
        if(p1->val>=10)
        {
            p1->val=p1->val%10;
            a=1;
        }
        else
        {
            a=0;
        }
        p1=p1->next;
        while(a)
        {
            p1->val=p1->val+a;
            if(p1->val>=10)
            {
                p1->val=p1->val%10;
                a=1;
            }
            else 
            {
                a=0;
            }
            if(p1->next!=NULL)
            {
                p1=p1->next;
            }
            else
            {
                if(a)
                {
                    p1->next=&jinwei;
                    jinwei.val=1;
                    jinwei.next=NULL;
                    a=0;
                }
                
            }

        }
        return l1;
    }
    else //两链表同时空
    {
        p1->val=p2->val+p1->val+a;
        if(p1->val>=10)
        {
            p1->val=p1->val%10;
            a=1;
        }
        else
        {
            a=0;
        }
        if(a)
        {
            p1->next=&jinwei;
            jinwei.val=1;
        }
        return l1;
    }

}

思路:
1.遍历两个链表,某个链表遍历完毕前对两个链表按节点相加,结果同时放入两个链表里
2.某个链表为空,进行分类讨论
3.同时为空时,判断是否进位,不进位直接返回一个链表,进位则加一个进位的节点后再返回
4.某一个为空时,判断不空的链表加上个节点的进位是否需要继续进位,若需要则继续运算进位+较长链表的节点,直到不需要进位为止。
此时可能出现两种情况:
①长链表遍历前就不用进位或遍历完毕最后一个节点不需要进位,此时直接返回长链表
②长链表遍历完毕仍需要进位,添加一个进位节点,之后返回链表

看了下其他人的解答,感觉这个写麻烦了,不过确实能跑XD

posted @ 2025-02-28 10:14  Osen  阅读(60)  评论(0)    收藏  举报