leetcode刷题记录——两数相加

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

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

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

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

自己的思路:

获取两个链表中的最长的链表的长度循环的对空链表添加两个链表每个结点对应的值的和,当短链表为空时只插入剩下长链表的值。设置一个b处理进位。

C语言(只能解决两个链表长度一样的时候,解决不了长度不相等/(ㄒoㄒ)/~~):

intLength(structListNode*p) {

inti=0;

structListNode*a=p;

while (a!=NULL) {

i++;

a=a->next;

}

returni;

}

structListNode*addTwoNumbers(structListNode*l1, structListNode*l2){

structListNode*p, *head, *p1, *p2;

p2= (structListNode*)malloc(sizeof(structListNode));

head=0;

inta=0;

if (Length(l1) >Length(l2)) {

a=Length(l1);

}

else {

a=Length(l2);

}

intb=0;

for (inti=0; i<a;i++) {

p1= (structListNode*)malloc(sizeof(structListNode));

if (l1!=NULL&&l2!=NULL) {

if ((l1->val+l2->val)<10) {

if (b==1) {

p1->val=l1->val+l2->val+1;

b=0;

}

else {

p1->val=l1->val+l2->val;

}

if (head==0) {

head=p1;

p2=p1;

l1=l1->next;

l2=l2->next;

}

else {

p2->next=p1;

p2=p1;

l1=l1->next;

l2=l2->next;

}

}

else {

p1->val= (l1->val+l2->val )%10;

b=1;

if (head==0) {

head=p1;

p2=p1;

l1=l1->next;

l2=l2->next;

}

else {

p2->next=p1;

p2=p1;

l1=l1->next;

l2=l2->next;

}

}

}

if (l2==NULL&&l1!=NULL) {

p1->val=l1->val;

if (head==0) {

head=p1;

p2=p1;

l1=l1->next;

}

else {

p2->next=p1;

p2=p1;

l1=l1->next;

}

}

if (l1==NULL&&l2!=NULL) {

p1->val=l2->val;

if (head==0) {

head=p1;

p2=p1;

l2=l2->next;

}

else {

p2->next=p1;

p2=p1;

l2=l2->next;

}

}

}

p1->next=NULL;

p=head;

returnp;

}

佬的思路:

用进位值来做相加和,将两个链表的空值分开判断。

C语言:

作者:suspicious-hamilton9tb链接:https://leetcode.cn/problems/add-two-numbers/solution/bi-jiao-jian-dan-yi-li-jie-de-cyu-yan-zu-cwgk/

structListNode*addTwoNumbers(structListNode*l1, structListNode*l2){

// 创造一个头结点,让头指针dummy指向它

structListNode*dummy=malloc(sizeof(structListNode));

// 创造一个指针,让cur指向最后

structListNode*cur=dummy;

// 创造一个进位判断值

intt=0;

// 循环(l1指向非空 或 l2指向非空 或 进位值非空)就执行

while(l1||l2||t){

// 如果l1指向非空,则将l1的值加到t上,l1指向l1的下一个结点

if(l1) t+=l1->val,l1=l1->next;

// 如果l2指向非空,则将l2的值加到t上,l2指向l2的下一个结点

if(l2) t+=l2->val,l2=l2->next;

// 创造一个结点,赋值。本来没想给新结点的next赋值,可是报错啊,百度了一下,不赋值就是野指针,C语言不允许

cur->next=malloc(sizeof(structListNode));

cur->next->val=t%10;

cur->next->next=NULL;

// cur指向下一个,也就是cur指向了新结点。

cur=cur->next;

t/=10;

}

// 返回头指针指向的下一个结点

returndummy->next;

}

// 时长:8ms 空间:7.7MB

Go语言:

funcaddTwoNumbers(l1*ListNode, l2*ListNode) *ListNode {

p :=new(ListNode)

node :=p

flag :=0

forl1!=nil||l2!=nil||flag!=0{

ifl1!=nil{

flag+=l1.Val

l1=l1.Next

}

ifl2!=nil{

flag+=l2.Val

l2=l2.Next

}

node.Next=new(ListNode)

node.Next.Val=flag%10

node=node.Next

flag/=10

}

returnp.Next

}

// 时长:12ms 空间:4.3MB

总结:

这道题对于我来说因为对链表不是很熟悉,实现的过程较为乱,在学习了大佬的思路后让我知道了新的思路,学到很多,自己在链表上的东西还是欠缺很多。

收获:

C语言和Go语言中链表的定义、链表的取值、链表的初始化。

学习链接:

链表学习:

C-https://zhuanlan.zhihu.com/p/249144171

Go-https://geekr.dev/posts/go-data-structure-linked-list

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值