zl程序教程

您现在的位置是:首页 >  其他

当前栏目

【看懂LeetCode】2.两数相加

LeetCode 相加 两数
2023-09-11 14:18:28 时间

一、绪

二、两数相加

链接: 两数相加.

(一)题目描述

解释

输入: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;
}