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<stdio.h>

 
 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值