每日一题(两数相加)

简介: 每日一题(两数相加)

每日一题(两数相加)


2. 两数相加 - 力扣(LeetCode)


f35e6247425347a7f3361c8dddfc60d5_b2fa8924d8a34b5bad21affbbfc5da7f.png


思路

思路:


1.由于链表从头开始向后存储的是低权值位的数据,所以只需要两个指针p1和p2,分别从链表的头节点开始遍历。同时创建一个新的指针newhead,(用于构造新链表,将创建的新节点进行头插)。并在这个构造的新链表的相应的节点中存储p1和p2对应值的相加结果。


2.但是p1和p2所对应的节点的值相加可能会产生进位,所以创建一个pre变量用于存储相应的进位值。(假设p1和p2所指向的节点的值是n1和n2,那么产生的进位值就是:pre = (n1+n2+pre)/10;同时对应新的创建的节点的值就应该是 (pre+n1+n2)%10;。对应代码如下:


    struct ListNode* p1=NULL,   *p2 = NULL, *newhead = NULL,*tail = NULL;
    int pre = 0;//pre一开始的值必须是0
    if(!l1)
    return l2;
    if(!l2)
    return l1;
    p1 = l1;
    p2 = l2;
    while(p1&&p2)
    {
struct ListNode* newnode = (struct ListNode*)malloc(sizeof(struct ListNode));
            newnode->val = (p1->val+p2->val+pre)%10;
            newnode->next = NULL;
        if(newhead == NULL)
        {
            //更新pre(进位)
            pre = (p1->val + p2->val)/10;
            newhead = tail = newnode;
        }
        else
        {
             //更新pre(进位)
            pre = (p1->val + p2->val+pre)/10;
            tail->next = newnode;
            tail = tail->next;
        }
        p1 = p1->next;
        p2 = p2->next;
    }

3.假如遇到的链表有以下这种长短不一的情况:就需要接着遍历那个较长的链表,将较长的链表中未被遍历的节点的值与pre的值一起参与运算,(因为这俩个链表的相同长度的部分的链表的最后一个节点中存储的值也会存在相加产生进位的情况)。代码实现如下:


while(p2)//当p2没有走完
        {
struct ListNode* newnode = (struct ListNode*)malloc(sizeof(struct ListNode));
        newnode->val = (p2->val+pre)%10;
        newnode->next = NULL;
    //更新pre
        pre = (p2->val+pre)/10;
        p2 = p2->next;
        tail->next = newnode;
        tail = tail->next;
        } 
        while(p1)//当p1没有走完
        {
struct ListNode* newnode = (struct ListNode*)malloc(sizeof(struct ListNode));
        newnode->val = (p1->val+pre)%10;
        newnode->next = NULL;
        //更新pre
        pre = (p1->val+pre)/10;
        p1 = p1->next;
        tail->next = newnode;
        tail = tail->next;
        }

7519fbccad2770a1a56d5000718ea8b7_81fc436a4395472182df45876eba4528.png


4.假如链表是如下这几种情况,即便是将两个链表都遍历之后,此时的进位值仍然是1,说明此时的相加计算还没有结束,此时还需要一个节点来存储进位值,所以在将两个链表遍历结束之后,需要对pre的值进行判断,假若pre的值是0,则直接返回newhead即可,pre的值若是1,则还需要创建一个节点。代码如下:


if(pre)
        {
struct ListNode* newnode = (struct ListNode*)malloc(sizeof(struct ListNode));
        newnode->val = pre;
        newnode->next = NULL;
        tail->next = newnode;
        tail = tail->next;
    }

0ac22bfca48b460781a6090e5403945e_6518cd686e254147a82d9b9444f86e09.png

5df0fc1576d4aa4aaadf5ca7472db9c5_b2ca7bff49524868acb8bb70f1dbf875.png



代码实现

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    struct ListNode* p1=NULL,   *p2 = NULL, *newhead = NULL,*tail = NULL;
    int pre = 0;
    if(!l1)
    return l2;
    if(!l2)
    return l1;
    p1 = l1;
    p2 = l2;
    while(p1&&p2)
    {
struct ListNode* newnode = (struct ListNode*)malloc(sizeof(struct ListNode));
            newnode->val = (p1->val+p2->val+pre)%10;
            newnode->next = NULL;
        if(newhead == NULL)
        {
            //更新pre(进位)
            pre = (p1->val + p2->val)/10;
            newhead = tail = newnode;
        }
        else
        {
             //更新pre(进位)
            pre = (p1->val + p2->val+pre)/10;
            tail->next = newnode;
            tail = tail->next;
        }
        p1 = p1->next;
        p2 = p2->next;
    }
       if(pre)
        {
struct ListNode* newnode = (struct ListNode*)malloc(sizeof(struct ListNode));
        newnode->val = pre;
        newnode->next = NULL;
        tail->next = newnode;
        tail = tail->next;
    }
    return newhead;
}


完结


两数相加的链表习题的分析就到这里啦,若有不足,欢迎评论区指正,下期见!


相关文章
|
27天前
|
存储 算法 C++
LeetCode第二题(两数相加)
这篇文章是关于LeetCode上第二题“两数相加”的题解,其中详细描述了如何使用C++语言来实现将两个逆序存储的非负整数链表相加,并返回结果链表的算法。
26 0
LeetCode第二题(两数相加)
|
3月前
|
算法
LeetCode第2题两数相加
该文章介绍了 LeetCode 第 2 题两数相加的解法,通过同时遍历两个链表的头节点,创建新链表接收计算结果,时间复杂度为 O(n)。
LeetCode第2题两数相加
|
3月前
|
JavaScript 前端开发 PHP
leetcode——两数相加【二】
leetcode——两数相加【二】
31 0
|
5月前
【LeetCode刷题】两数之和、两数相加
【LeetCode刷题】两数之和、两数相加
|
6月前
|
存储 算法 测试技术
|
6月前
|
存储 算法 Go
LeetCode第二题: 两数相加
 给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
LeetCode第二题: 两数相加
|
6月前
|
存储
【力扣】2. 两数相加、445. 两数相加Ⅱ
【力扣】2. 两数相加、445. 两数相加Ⅱ
|
6月前
|
存储
leetcode-2:两数相加
leetcode-2:两数相加
40 0
|
存储 算法
LeetCode2-两数相加
LeetCode2-两数相加
|
Java Python
leetcode每日一题.445:两数相加II
leetcode每日一题.445:两数相加II
84 0