LeetCode-2.两数相加 使用链表加法实现
时间:2022-07-22
本文章向大家介绍LeetCode-2.两数相加 使用链表加法实现,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
先看题目
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
方案一:把链表转换为数字相加,再形成链表,这样做的问题是系统样例测试输入链表很长的时候,程序的基本类型存不下(溢出),这种方法不推荐。
方案二:链表的每个结点单独相加,如上面是2+5=7,6+4=10(这里要进一位)
直接上代码:
#include<stdio.h>
#include<stdlib.h>
struct ListNode {
int val;
struct ListNode *next;
};
/**
* LeetCode
* 2.两数相加
* https://leetcode-cn.com/u/banana798/
*/
//添加结点
ListNode* add(ListNode*head, int temp){
ListNode *p=head;
while(1){
if(p->next==NULL){
p->next=(ListNode*)malloc(sizeof(ListNode));
p->next->val = temp;
p->next->next=NULL;
return head;
}
p=p->next;
}
}
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode *head = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode *p=l1, *q=l2, *curr = head;
//tag用以标记进位
int tag = 0;
while(p!=NULL||q!=NULL){
int x = p ? p->val : 0;
int y = q ? q->val : 0;
int sum = tag + x + y;
tag = sum/10;
curr->next = (struct ListNode*)malloc(sizeof(struct ListNode));
curr->next->next=NULL;
curr->next->val = sum%10;
curr=curr->next;
if(p) p=p->next;
if(q) q=q->next;
}
//最后进1位
if(tag>0){
curr->next = (struct ListNode*)malloc(sizeof(struct ListNode));
curr->next->next=NULL;
curr->next->val = tag;
}
return head->next;
}
int main(){
struct ListNode *l1 = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode *l2 = (struct ListNode*)malloc(sizeof(struct ListNode));
l1->next=NULL;
l2->next=NULL;
//向链表添加测试数据
add(l1,1);
add(l2,9);
l1=addTwoNumbers(l1->next,l2->next);
printf("%d->%d",l1->val,l1->next->val);
}
注意:LeetCode这里没有说明链表带不带头结点,经过我的测试后发现所有样例的链表都是没有头结点的。
- MBR勒索木马再度来袭:GoldenEye分析
- Docker Compose 1.18.0 之服务编排详解
- 基于Metronic的Bootstrap开发框架经验总结(6)--对话框及提示框的处理和优化
- 基于Metronic的Bootstrap开发框架经验总结(7)--数据的导入、导出及附件的查看处理
- Ubuntu 17.04 x64 安装 Docker CE
- 这是一篇清晰易懂的 Rxjava 入门教程
- 可能是最详细的部署:Docker Registry企业级私有镜像仓库Harbor管理WEB UI
- 简单好用的阴影库 ShadowLayout
- 【项目管理和构建】——Maven下载、安装和配置(二)
- 打印机安全研究(一):不容乐观的网络打印机安全状况
- Apache Maven 入门篇
- hyperledger v1.0.5 区块链运维入门(一)
- 分析无线遥控器信号并制作Hack硬件进行攻击
- 第二章:Shiro入门——深入浅出学Shiro细粒度权限开发框架
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【收藏】万字解析Scipy的使用技巧!
- Python 如何使用 HttpRunner 做接口自动化测试
- Python 爬虫时,高版本 App 如何进行抓包?
- 使用 shell-operator 实现 Operator
- 我们是如何用 K8S 搞定1000个应用的测试环境
- 关于Python 3.9,那些你不知道的事
- urllib, urllib2, urllib3 都是小弟弟
- 使用 Kustomize 定制 Helm Chart
- 装逼篇 | 抖音超火的九宫格视频是如何生成的,Python 告诉你答案
- 最全总结 | 聊聊 Python 数据处理全家桶(Mysql 篇)
- 6个提升效率的pandas小技巧
- 如何用 Python 让微博热搜榜动起来
- 如何用 Python 让微博热搜榜动起来
- 漫画:什么是 “抽象工厂模式” ?
- 5个很常用的CSS3网页小实例