leetcode - [链表] - (2) 两数相加

本文介绍了一种使用链表表示非负整数的加和算法,详细解释了如何通过同步迭代两个链表,并处理进位逻辑,最终生成表示两数之和的新链表。文章覆盖了边界条件分析、数据结构定义、初始化过程及核心处理逻辑。

1、问题描述

使用两个非空的链表来表示两个非负整数,其中链表的每个节点存储着数位上的一个数,且按照逆序存储。
将两数加和,返回一个新的链表来表示这两个数的和。
您可以假设除数字0外,这两个数都不会以0开头。
示例:

输入:(2->4->3+5->6->4)
输出:(7->0->8)
原因:342 + 465 = 807

2、解题思路

  • 边界条件:(1)两条链表皆为空;(2)有一条链表为空;(3)两个n位数相加得到n+1位数,如55 + 60 = 125。(4)两条链表的位数相差很大,如2和1453;
  • 思路分析:先声明一下所使用的数据结构,
  • 三个迭代指针p1、p2,p1表示list1的迭代指针,p2表示list2的的迭代指针,p3表示加和后新链表的迭代指针;
  • 加和后新链表的头节点dummyhead;
  • 进位标志变量carry ,如果carry=true,代表需要进位;
  • 初始化:刚开始令p1指向第一个链表list1的第一个节点,p2指向第二个链表list2的第一个节点;申请dummyhead节点;并令p3指向dummyhead节点
  • 处理逻辑:
  • p1、p2在list1、list2上进行同步迭代,如果p1、p2指向的节点均不为空,则申请一个新的节点new_node,将p1、p2所指向的两个节点之和赋值给new_node的值域,令p3的next指针指向new_node,p3=new_node;
  • 如果p1指向的为空,而p2指向的不为空,则直接将p2及其后面的所有节点复制到p3后面;
  • 如果p1指向的不为空,而p2指向的为空,则直接将p1及其后面的所有节点复制到p3后面。

3、代码实现

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* p1;
        ListNode* p2;
        ListNode* p3;
        bool carry;
        ListNode dummyhead(0);
        
        p1 = l1;
        p2 = l2;
        p3 = &dummyhead;
        carry = false;

        int value = 0;
        ListNode* new_node = NULL;
        while(p1 != NULL && p2 != NULL){
            value = p1->val + p2->val;
            if (carry == true){
                value += 1;
            }
            carry = (value >= 10) ? true : false ;
            if(value >= 10){
                value -= 10;
            }
            new_node = new ListNode(value);
            p3->next = new_node;
            p3 = new_node;
            
            p1 = p1->next;
            p2 = p2->next;
        }
        while(p1 != NULL){
            value = p1->val;
            if(carry == true){
                value += 1;
            }
            carry = (value >=10 ) ? true : false ;
            if(value >= 10){
                value -= 10;
            }
            new_node = new ListNode(value);
            p3->next = new_node;
            p3 = new_node;

            p1 = p1->next;
            
        }
        while(p2 != NULL){
            value = p2->val;
            if(carry == true){
                value += 1;
            }
            carry = (value >= 10) ? true : false;
            if(value >= 10){
                value -= 10;
            }
            
            new_node = new ListNode(value);
            p3->next = new_node;
            p3 = new_node;

            p2 = p2->next;
            
        }
        if (carry == true){
            new_node = new ListNode(1);
            p3->next = new_node;
        }
        return dummyhead.next;
        
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Albert_YuHan

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

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

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

打赏作者

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

抵扣说明:

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

余额充值