LeetCode第二题----俩数相加

LeetCode第二题----俩数相加,第1张

LeetCode第二题----俩数相加

 这种题目先读懂,不要被逆序混淆视听

先根据图来看,l1先取2,l2先取5,输出的是2+5=7,

第二步 4 + 6=10,进1,为0

第三步3+4=7,加一为8.

然后顺序输出 7 0 8

这样一看就是一个单链表的尾插,将俩个链表遍历输出相加,然后尾插到一个新的链表中,最后返回新链表。

方法知道了,就要考虑情况

主要分2种

一.l1和l2长度相同

在长度相同中又分

1.最后一组数据有进位

2.最后一组数据没有进位

二.l1和l2长度不同

在长度不同中又分

1.l1长

2.l2长

3.有进位

4.没有进位

搞清楚了这些,就可以开始写代码了

#define _CRT_SECURE_NO_WARNINGS
#include

 
 struct ListNode {
     int val;
     struct ListNode *next;
 };
 
struct ListNode* addTwonumbers(struct ListNode* l1, struct ListNode* l2) {
    struct ListNode* p = l1;
    struct ListNode* q = l2;
    struct ListNode* sum = NULL; //用于存放结果的链表
    struct ListNode* last = NULL;//指向sum的尾节点
    int carry = 0;  //进制位,也是状态位,为0没有进位,为1有进位

    
    //遍历p、q
    //当p或q其中一个遍历完了就结束
    while (p != NULL && q != NULL)
    {
        //将一组数据的和赋给s
        int s = p->val + q->val + carry;
        carry = 0;
        //有进位时
        if (s > 9) {

            s -= 10;   //个位,也是数据位
            carry = 1;    //进位
        }
        
        //sum链表为空
        if (!sum) {
            //扩容
            sum = (struct ListNode*)malloc(sizeof(struct ListNode));
            sum->val = s;
            sum->next = NULL;
            //last指向sum的尾节点
            last = sum;
        }
        //sum链表不为空
        else {
            //尾插
            struct ListNode* t = (struct ListNode*)malloc(sizeof(struct ListNode));
            t->val = s;
            t->next = last->next;
            last->next = t;
            last = t;
        }
        p = p->next;
        q = q->next;
    }

    //长度不同

    if (p) {      //如果p的长度长
        //直接将后面的节点链入
        last->next = p;
    }
    else {     //如果q的长度长
        //直接将后面的节点链入
        last->next = q;
    }
    
    //有进位
    if (carry) {
        //俩链表长度不同
        while (last->next) {
            int s = carry + last->next->val;
            carry = 0;
            if (s > 9) {
                s -= 10;
                carry = 1;
            }
            last->next->val = s;
        
            //直到没有进位时结束,有继续
            if (carry) {
                last = last->next;
            }
            else {
                break;
            }
        }
        //俩链表长度相同
        if (!last->next) {
            //尾插
            struct ListNode* t = (struct ListNode*)malloc(sizeof(struct ListNode));
            t->val = carry;
            t->next = NULL;
            last->next = t;
            last = t;
        }
    }

    return sum;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5659286.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存