首页 > 编程语言 >【C++】假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。 给定两个这种链表,请生成代表两个整数相加值的结果链表。 数据范围:0≤n,m≤1000000,链表任意值 0

【C++】假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。 给定两个这种链表,请生成代表两个整数相加值的结果链表。 数据范围:0≤n,m≤1000000,链表任意值 0

时间:2024-02-12 13:11:25浏览次数:33  
标签:ListNode int res 复杂度 整数 next 链表 tmpNode

题目:假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。
给定两个这种链表,请生成代表两个整数相加值的结果链表。
数据范围:0≤n,m≤1000000,链表任意值 0≤val≤9
要求:空间复杂度 O(n),时间复杂度 O(n)
例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。

有两种解法,代码如下:

#include <iostream>
#include <stack>
using namespace std;
struct ListNode {
  int val;
  ListNode* next;
  ListNode(int x) :val(x), next(nullptr) {}
};
//链表的翻转
ListNode* REVERSEList(ListNode* L) {
  stack<int> s1, s2;
  ListNode* cur = L;
  ListNode* prev = NULL;
  while (cur) {
    ListNode* tmp = cur->next;
    cur->next = prev;
    prev = cur;
    cur = tmp;
  }
  return prev;
}
//两个链表相加(使用栈)
ListNode* addList1(ListNode* head1, ListNode* head2) {
  stack<int> x1, x2;//用来存储两个链表的数据
  while (head1) {
    x1.push(head1->val);
    head1 = head1->next;
  }
  while (head2) {
    x2.push(head2->val);
    head2 = head2->next;
  }
  int cnt = 0;//如果两个值的和>10,就会产生进位,这个用来存储进位
  int sum = 0;
  ListNode* res = NULL;
  while (!x1.empty() || !x2.empty()) {
    int s1 = x1.empty() ? 0 : x1.top();
    int s2 = x2.empty() ? 0 : x2.top();
    if (!x1.empty()) x1.pop();
    if (!x2.empty()) x2.pop();
    sum = s1 + s2 + cnt;//当前这一位的总和
    cnt = sum / 10;//查看当前加和是否有进位
    //进行当前节点的插入
    ListNode* tmpNode = new ListNode(sum % 10);
    tmpNode->next = res;
    res = tmpNode;
  }
  if (cnt > 0) {
    ListNode* tmpNode = new ListNode(cnt);
    tmpNode->next = res;
    res = tmpNode;
  }
  return res;
}
//两个链表相加(使用链表翻转)
ListNode* addList2(ListNode* head1, ListNode* head2) {
  ListNode* newHead1 = REVERSEList(head1);
  ListNode* newHead2 = REVERSEList(head2);
  int cnt = 0;
  ListNode* res = nullptr;
  while (newHead1 || newHead2) {
    if (!newHead1) return newHead2;
    if (!newHead2) return newHead1;
    int x1 = (newHead1 != NULL) ? newHead1->val : 0;
    int x2 = (newHead2 != NULL) ? newHead2->val : 0;
    int sum = x1 + x2 + cnt;
    cnt = sum / 10;
    ListNode* tmpNode = new ListNode(sum % 10);
    tmpNode->next = res;
    res = tmpNode;
    if (newHead1->next)newHead1 = newHead1->next;
    if (newHead2->next)newHead2 = newHead2->next;
  }
  if (cnt > 0) {
    ListNode* tmpNode = new ListNode(cnt);
    tmpNode->next = res;
    res = tmpNode;
  }
  return res;
}

 

标签:ListNode,int,res,复杂度,整数,next,链表,tmpNode
From: https://www.cnblogs.com/smartlearn/p/18013788

相关文章

  • 力扣递归 两道简单题合成一道中等题之148. 排序链表
    递归归并排序,先找到终点,再合并两个链表 给你链表的头结点 head ,请将其按升序排列并返回排序后的链表。 示例1:输入:head=[4,2,1,3]输出:[1,2,3,4]示例2:输入:head=[-1,5,3,4,0]输出:[-1,0,3,4,5]示例3:输入:head=[]输出:[]/** *Definitionforsingl......
  • 力扣快慢双指针之876. 链表的中间结点
    给你单链表的头结点head,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。 示例1:输入:head=[1,2,3,4,5]输出:[3,4,5]解释:链表只有一个中间结点,值为3。示例2:输入:head=[1,2,3,4,5,6]输出:[4,5,6]解释:该链表有两个中间结点,值分别为3......
  • 力扣递归之21. 合并两个有序链表
    将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。  示例1:输入:l1=[1,2,4],l2=[1,3,4]输出:[1,1,2,3,4,4]示例2:输入:l1=[],l2=[]输出:[]示例3:输入:l1=[],l2=[0]输出:[0]classSolution{publicListN......
  • C语言解题 || 调整数列
    题目:有n个整数,使其前面各数顺序向后移m个位置,移出的数再从头移入,使得最后m个数变成前面m个数。例:设n为6,m为2,当n个数为{1,2,3,4,5,6},函数使之变为{5,6,1,2,3,4}编写一个函数move,实现以上功能,该函数的声明如下:voidmove(int*x,intn,intm)实现思想:拿出最后一个数,然后其他数字......
  • C++编程练习||1.类模板2.整数集合类3.复数集合类,模板结合
    1.类模板 类模板的作用  使用类模板使用户可以为类声明一种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值,能取任意类型(包括基本类型的和用户自定义类型)。  类模板的声明  类模板template<模板参数表>class类名{类成员声明};  ......
  • 代码随想录 day41 整数拆分 不同的二叉搜索树
    整数拆分这里的递推式子很不好想一般的想法是dp[i]=max(dp[i],dp[i-j])但是这个式子需要赋值dp[1]=1dp[2]=2dp[3]=3这个不符合dp[i]定义这里递推式子如下dp[i-j]等于拆分成两个或两个以上的数字i*(i-j)就是两个数字拆分不同的二叉搜索树难点依旧是递推式是怎么......
  • 数据结构(一)单链表---以题为例
    实现一个单链表,链表初始为空,支持三种操作:向链表头插入一个数;删除第 k 个插入的数后面的数;在第 k 个插入的数后插入一个数。现在要对该链表进行 M 次操作,进行完所有操作后,从头到尾输出整个链表。注意:题目中第 k 个插入的数并不是指当前链表的第 k 个数。例如操作......
  • CSAPP 第二章 信息的表示与处理(2) 整数运算
    加减法运算所有的加法运算在内存中的运算都遵循二进制的计算法则,只不过因为相同二进制表示在不同整数类型下表示的数不同,运算法则也有所不同。无符号加法计算规则可以将无符号数的加法视作是一种模运算,在二进制表示中丢弃掉溢出的位的操作就......
  • 根据筛法规则对整数分类,建立树状结构
    筛法目前一般用来找整数序列中的素数,不是素数的元素被丢掉了。如果仅把筛法当成一种分类规则,把筛掉的元素和留下的元素算作不同的分类,并用每一类中的最小元素递归地执行筛法,那么能把所有正整数保留下来,并建立一个树状结构。例如,初始集合是正整数集,根据模最小元素p是否为0,可把所有......
  • [数据结构] 链表
    写在前面菜鸡博主开始复习了,先从数据结构开始吧(其实是每天复习高数太累了)1.单链表单链表是线性表的链式存储,是指通过一组任意的存储单元来存储线性表中的数据元素。对每个链表节点,除了存放元素自身的信息之外,还需要存放一个指向其后继的指针(如下图所示)单链表的节点可以用如......