《LeetCode 》 ---- 两数相加 (一半样例)
Posted ×序猿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《LeetCode 》 ---- 两数相加 (一半样例)相关的知识,希望对你有一定的参考价值。
此题选自 LeetCode 第二题 ----- 《两数相加》
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
示例 2:
输入:l1 = [0], l2 = [0]
输出:[0]
示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:将链表的值分别取出,存到一个动态二维数组,逆置。转换成 long long int,两值相加,再求余,求出每一位,导入新链表并返回。
问题:long long int 只能有十位,当两值相加超过十位,long long int 此时会爆,故这种方法只能过 一半样例。
注:代码中 逆置(头插法) 此题并未用到。
#include <iostream> #include<stdio.h> #include<stdlib.h> using namespace std; struct node{ int data; struct node *next; }; void Init(struct node *L) //创建单链表 { int n; struct node *p; cin>>n; while(n!=-1) // 当输入-1 停止 { p = new node; //cin>>p->data; p->data=n; p->next=NULL; L->next=p; L=L->next; cin>>n; } } void Inverse_set(struct node *L) //逆置 { struct node *q,*p; p = L; // p 指向 head p=L->next; L->next=NULL; //q = p; // 两指针指向第一个 while(p) { q=p; p=p->next; /*头插*/ q->next=L->next; L->next=q; } } struct node* addTwoNumbers(struct node *l1,struct node *l2){ int *a,*b,*z,*h; a = (int*)malloc(100*sizeof(int)); z =a; b = (int*)malloc(100*sizeof(int)); h = b; struct node *p,*q; p = l1; int n1=0; while(p){ *z = p->data; cout<<a[n1]<<\' \'; z = z + 1; p=p->next; n1++; } cout<<"\\n"; int i; for(i=0;i<n1/2;i++) { int temp = a[i]; a[i] = a[n1-1-i]; a[n1-1-i] = temp; } // 加和 int sum = 0; for(i=0; i<n1; i++){ sum = sum * 10 + a[i]; } cout<<sum<<" \\n"; long long int sum1 = sum; q=l2; int n2=0; while(q){ *h = q->data; cout<<b[n2]<<\' \'; h = h + 1; q=q->next; n2++; } cout<<"\\n"; for(i=0;i<n2/2;i++) { int temp = b[i]; b[i] = b[n2-1-i]; b[n2-1-i] = temp; } // 加和 sum = 0; for(i=0; i<n2; i++){ sum = sum * 10 + b[i]; } cout<<sum; sum = sum1+sum; if(sum==0) {p = (node*)malloc(sizeof(node)); p->data=0; p->next=NULL; return p; } int k = sum; int n = 0; while(k) { k=k/10; n=n+1; } p = (node*)malloc(n*sizeof(node)); struct node *x; x = p; k = sum; cout<<"\\nsum:"<<sum<<endl; x->data=k%10; x->next=NULL; k=k/10; while(n-1) { q = new node; q->data=k%10; q->next=NULL; k=k/10; x->next=q; x=x->next; n--; } return p; } void show(struct node *L) //输出单链表 { struct node *q; q = L; while(q) { cout<<q->data<<\' \'; q = q->next; } } int main(){ struct node *l1,*l2,*p,*q; l1 = new node; int k; cin>>k; l1->data = k; l1->next = NULL; Init(l1); l2 = new node; cin>>k; l2->data = k; l2->next = NULL; Init(l2); q = addTwoNumbers(l1,l2); cout<<"\\n\\n"; show(q); }
以上是关于《LeetCode 》 ---- 两数相加 (一半样例)的主要内容,如果未能解决你的问题,请参考以下文章