002 两数相加

给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/add-two-numbers

题解:

1、高精度的原理

所谓高精度加法其实就是按加法竖式规则相加,即按“位”相加,满十进位。

这里的按“位”相加指的是个位加个位,十位加十位,百位加百位……

2、思路:

根据题意,我们要将按“位”相加的结果同样以链表形式逆序存放,应从左向右依次计算,不断创建结点存放按“位”相加的结果

3、注意:

两原始链表可能不等长

在两链表等长的情况下,若两链表的最后一个结点值相加的值有进位,需要生成一个新的结点存放进位值

#include <iostream>
using namespace std;
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */

struct ListNode{
    int val;
    ListNode *next;
    ListNode() : val(0),next(NULL){}
    ListNode(int x) : val(x), next(NULL){}
    ListNode(int x, ListNode *next) : val(x), next(next){}
};


class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2);
};



ListNode* Solution::addTwoNumbers(ListNode* l1, ListNode* l2)
    {
        ListNode * H = new ListNode();//申请一个ListNode结点,存放结果
        ListNode * ptr = H;//定义ListNode类型的ptr指针指向新建的节点

        int carry = 0;//carry用于进位计数
        while(l1 || l2 || carry)//直到l1,l2和进位都为零,循环结束
        {
            int val = 0;
            if(l1){
                val += l1->val;
                l1 = l1->next;
            }    
            if(l2){
                val += l2->val;
                l2 = l2->next;
            }    
            val += carry;

            ListNode *node = new ListNode(val % 10);//生成节点存放按位相加的和,如果大于十取余数,向进一位
            ptr->next = node;//将相加的和放入存放结果的链表中
            ptr = node;//然后ptr指针后移到新加入的节点,ptr始终指向结果链表的位结点
            carry =val / 10;//进位计算,val大于十有进位,val小于十没有进位

        }
        //H->next;
        return H->next;

    }

class Solution s;

int main(int argc, char *argv[])
{
   //创建单链表l1、l2
   ListNode* l1 = new ListNode();
   ListNode* l2 = new ListNode();
   ListNode* p1 = l1;
   ListNode* q1 = l1;
   ListNode* p2 = l2;
   ListNode* q2 = l2;
   p1->next = NULL;
   int n1 = 342;
   int n2 = 465;
   while(n1%10)
   {
     ListNode* node1=new ListNode();
      node1->val=n1%10;
      node1->next=NULL;
      p1->next = node1;
      p1 = node1;
      n1 = n1 / 10;
   }
   while(n2%10)
   {
     ListNode* node2=new ListNode();
      node2->val=n2%10;
      node2->next=NULL;
      p2->next = node2;
      p2 = node2;
      n2 = n2 / 10;
   }


   //打印单链表l1、l2
   while(q1->next!=NULL)
   {
       //cout<<l1->val<<" ";
       q1=q1->next;
       cout<<q1->val<<" ";
   }

   cout<<endl;

   while(q2->next!=NULL)
   {
       //cout<<l1->val<<" ";
       q2=q2->next;
       cout<<q2->val<<" ";
   }



   cout<<endl;
   ListNode* res = new ListNode();
   //ListNode* p3 = new ListNode();
   res = s.addTwoNumbers(l1,l2);
   while(res->next!=NULL)
    {
        res=res->next;
        cout<<res->val<<" ";

    }
    return 0;
}

结果:

猜你喜欢

转载自blog.csdn.net/fencecat/article/details/129688590
002