关于leetcode中链表中两数据相加的程序说明
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/ typedef struct ListNodep {
int val;
struct ListNodep *next;
}ListNode; ListNode* addTwoNumbers(ListNode* I1, ListNode* I2) {
ListNode *rootp = NULL;
ListNode *listp = NULL;
int value = 0;
int varin = 0; if(I1 == NULL && I2 == NULL) return rootp; listp = (ListNode *)malloc(sizeof(ListNode));
rootp = listp;
listp->val = 0;
listp->next = NULL; while(I1 != NULL || I2 != NULL || varin!= 0){ if(I1 == NULL && I2 != NULL) value = I2->val + varin; if(I1 != NULL && I2 == NULL) value = I1->val + varin; if(I2 != NULL && I1 != NULL) value = I1->val + I2->val + varin; if(I1 == NULL && I2 == NULL) value = varin; varin = 0; if(value >= 10){
varin = value /10;
value = value %10;
} //此处需要注意,此处需要注意当当前链表已经为NULL后,他指向的空链表
//不能够在往下操作了,需要直接在给当前指针为空链表
if(I1 == NULL) I1 = NULL;
else I1 = I1->next; if(I2 == NULL) I2 = NULL;
else I2 = I2->next; listp->val = value; if(I1 != NULL || I2 != NULL || varin != 0){
listp->next = (ListNode *)malloc(sizeof(ListNode));
listp = listp->next;}
else
{
listp->next = NULL;
}
} return rootp;
}
leetcode问题描述 :
You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------
这里的两个链表数据相加问题可不是那么简单,主要有一下几种情况
1、如果两个链表长度是一样的,就将链表中的元素相加输出即可
2、如果两个链表的长度不是一样的,就要短链表位的补齐,如果不是使用补齐的方法,就需要考虑在逻辑上消除这种现象
3、如果两个链表长度一样长,但是在最后一个元素相加出现了进位,那么就需要在最后一个链表上在添加一个链表,
所以其实这个问题还是蛮复杂的
下面是在c中运行时的代码 :
// list.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#define ListDeep 1
typedef struct NODE{
NODE *P;
int data;
}ListTypr;
ListTypr list1[ListDeep];
ListTypr list2[ListDeep];
//---------------------------------------------------------------
void initlist(ListTypr *I1 , ListTypr *I2 , int listdeep){
for(short i = ; i < listdeep ; i++){
I1->data=;
if(i == listdeep-) I1->P= NULL;
else I1->P= I1+;
I1 = I1->P;
}
for(short i = ; i < listdeep ; i++){
I2->data=;
if(i == listdeep-) I2->P= NULL;
else I2->P= I2+;
I2 = I2->P;
}
}
ListTypr* addTwoNumbers(ListTypr* l1, ListTypr* l2) {
ListTypr *rootp = NULL;
ListTypr *listp = NULL;
int value = ;
int varin = ;
if(l1 == NULL && l2 == NULL) return rootp;
listp = (ListTypr *)malloc(sizeof(ListTypr));
listp->data = ;
listp->P = NULL;
rootp = listp;
while(l1 != NULL || l2 != NULL || varin != ){
if(l1 != NULL && l2 == NULL) value = l1->data + varin;
if(l1 == NULL && l2 != NULL) value = l2->data + varin;
if(l1 != NULL && l2 != NULL) value = l1->data + l2->data + varin;
if(l1 == NULL && l2 == NULL) {
value = varin;
varin = ;
}
if(value >= ){
varin = value / ;
value = value % ;
}
if(l1 == NULL) l1 = NULL;
else l1 = l1->P;
if(l2 == NULL) l2 = NULL;
else l2 = l2->P;
listp->data = value;
if(l1 != NULL || l2 != NULL || varin != ){
listp->P = (ListTypr *)malloc(sizeof(ListTypr));
listp = listp->P;}
else{
listp->P = NULL;
}
}
return rootp;
}
int _tmain(int argc, _TCHAR* argv[])
{
short listdeep = ListDeep;
ListTypr * plistresult = NULL;
ListTypr * rep = NULL;
int resultmatrix[];
short i = ;
initlist(&list1[] , &list2[] , listdeep);
plistresult = addTwoNumbers(&list1[] , &list2[]);
while(plistresult != NULL){
resultmatrix[i] = plistresult->data;
plistresult = plistresult->P;
i = i + ;
}
while();
return ;
}
关于leetcode中链表中两数据相加的程序说明的更多相关文章
- 【LeetCode题解】2_两数相加
目录 [LeetCode题解]2_两数相加 描述 方法一:小学数学 思路 Java 代码(非递归写法) Java 代码(递归写法) Python 代码(非递归写法) [LeetCode题解]2_两数相 ...
- Leetcode(2)两数相加
Leetcode(2)两数相加 [题目表述]: 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两 ...
- Leetcode(2)-两数相加(包含链表操作的注意事项)
给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -& ...
- LeetCode -- 推断链表中是否有环
思路: 使用两个节点.slow和fast,分别行进1步和2步.假设有相交的情况,slow和fast必定相遇:假设没有相交的情况,那么slow或fast必定有一个为null 相遇时有两种可能:1. 仅仅 ...
- leetcode刷题2:两数相加add_two_numbers
题目:两数相加 (难度:中等) 给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字. 将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以 ...
- LeetCode Add Two Numbers 两个数相加
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode ...
- LeetCode题解002:两数相加
两数相加 题目 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字 如果,我们将这两个数相加起来,则会返回一个新的链表 ...
- C语言链表之两数相加
题目描述 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...
- Leetcode(二)两数相加
两数相加 题目描述 给出两个非空的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链 ...
随机推荐
- ASP.NET MVC location.href不跳转
表单使用submit导致不跳转 <button type="button">
- Android下安装应用不成功解决
在手机上安装应用程序不成功,可以尝试把手机连接电脑,然后使用adb进行安装,adb安装命令: adb install Android_65632.apk 当出现: success!就表示成功,但当不成 ...
- Cen0S下挂载设备
在CentOS中,如果我们要查看光驱,U盘或者要把安装包挂载到某个文件夹,我写下我的一些理解. 所谓的挂载,就是把物理设备或者文件(包含安装文件,压缩包等等),与系统中的某个目录建立一个快捷方式,然后 ...
- Windows Server 2008 R2安装子域控制器
一.实验网络拓扑图: 二.实验说明: 子域控制器安装前需要先把主域控制器安装好,然后子域控制器的DNS先指向主域控制器的IP地址 192.168.10.30,主域控制器委派DNS给子域控制器后再把子域 ...
- lua 类支持属性不能被修改
背景 lua是类是借助表的来实现的, 类被定义后, 在使用场景下, 不希望被修改.如果被修改, 则影响的类的原始定义, 影响所有使用类的地方. 例如: --- router.lua class fil ...
- JOIN,WHERE判断和ORDERBY排序
MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快.因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小. 如果重复代码只是 ...
- XPath、XQuery 以及 XSLT 函数
存取函数 名称 说明 fn:node-name(node) 返回参数节点的节点名称. fn:nilled(node) 返回是否拒绝参数节点的布尔值. fn:data(item.item,...) 接受 ...
- 网站登录后会话无法保存。php环境
在php 页面中phpinfo() 看下session 是否存在.session 的path 是否设置.具体的还要自己检查. 1.php.ini中的output_buffering=off 改成out ...
- 20.谈谈对mvc的认识。
MVC是 模型(Model) .视图(View).控制器(Control) 的英文首字母的缩写,核心思想是:视图和用户交互 通过事件导致控制器改变 控制器改变导致模型改变 或者控制器同时改变两者 模型 ...
- Android监听返回键、Home键+再按一次返回键退出应用
Android监听返回键需重写onKeyDown()方法 Home键keyCode==KeyEvent.KEYCODE_HOME @Override public boolean onKeyDown( ...