【看懂LeetCode】2.两数相加

这篇博客详细介绍了如何使用链表实现LeetCode上的经典问题——两数相加。通过创建一个新的链表作为结果,遍历两个输入链表并逐位相加,同时处理进位问题。博主提供了完整的AC代码,解析了关键步骤,包括如何处理链表结束和进位的情况,最后展示了如何检查并处理最后的进位。
摘要由CSDN通过智能技术生成

一、绪

二、两数相加

链接: 两数相加.

(一)题目描述

解释

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

输入:l1 = [2,4,3], l2 = [5,6]
输出:[7,0,4]
解释:342 + 65 = 407.

输入:l1 = [9,9,9], l2 = [1,1]
输出:[0,1,0,1]
解释:999 + 11 = 1010.

解题思路

//1.先定义一个结果链表,初始化后,定义一个链表节点p,去遍历结果链表
//2.定义链表节点*p1、*p2去分别遍历两个链表,将两个链表对应地逐个节点值相加
    //问题:如果链表中其中一个链表提前遍历到尾端,怎么办?
    //应对方法:定义整型v1、v2去接收节点值,当链表走到尾端时,则节点为空,此时对应的v1或v2则赋值为0
    //定义一个进位值jinWei,若两个节点值之和大于10,jinWei=1,否则等于0
//3.当两个链表都遍历完成后,判断最后一位有无进位,有则将结果链表最后一位进行赋值,无则将最后一位设为空。
	//注意:不能直接将最后一个节点赋为NULL,因为末节点的前一个节点(pre)的next指针依旧指着末节点,必须将末节点(pre)的前一个节点的next指针赋为NULL才可。
//4.相加结束后,将结果链表return

(二)AC代码

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

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    //1.先定义一个结果链表,初始化后,定义一个链表节点p,去遍历结果链表
    struct ListNode *result,*p;
    result = p = (struct ListNode*)malloc(sizeof(struct ListNode));
    result->next = NULL;
    p=result;

    //2.定义链表节点*p1、*p2去分别遍历两个链表,将两个链表对应地逐个节点值相加
        //问题:如果链表中其中一个链表提前遍历到尾端,怎么办?
        //应对方法:定义整型v1、v2去接收节点值,当链表走到尾端时,则节点为空,此时对应的v1或v2则赋值为0
        //定义一个进位值jinWei,若两个节点值之和大于10,jinWei=1,否则等于0。初始为0
    struct ListNode *p1,*p2,*pre;
    int v1,v2,sum,jinWei=0;
    p1 = p2 = pre = (struct ListNode*)malloc(sizeof(struct ListNode));
    p1 = l1;
    p2 = l2;
    while(p1||p2){
        //获取两个链表的节点值
        if(p1) v1 = p1->val;
        else v1 = 0;
        if(p2) v2 = p2->val;
        else v2 = 0;

        //开始相加,并处理进位问题
        sum = v1+v2+jinWei; //要记得加进位值
        if(sum>=10){ //若相加和大于10,则进位
            sum -= 10;
            jinWei = 1;
        }
        else{ //否则无
            jinWei = 0;
        }

        p->val = sum; //给结果链表节点赋值

        //往结果链表下一位遍历
        //注意,如果两条相加的链表均遍历到了最后一位,这里最后会留下一个末尾空结点,需要在循环外作处理,或则放最后一位的进位,或设为NULL
        p->next = (struct ListNode*)malloc(sizeof(struct ListNode));
        pre = p;
        p = p->next;
        p->next = NULL;

        //往两条链表的下一位遍历
        if(p1) p1=p1->next;
        if(p2) p2=p2->next;
    }

    //判断最后一位有无进位,有则对最后一位进行赋值,无则把上面末尾剩余的一个空结点的前一个节点的next指针设为NULL
    if(jinWei==1){
        p->val = jinWei;
    }
    else pre->next = NULL;

    return result;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

peng_YuJun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值