第二题 两数之和
-
原题:
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
-
需要特别关注的一些情况
- 两个链表不一样长
- 进位会多出一位,如输入为【9,9,9】,【9,9】
- 两个链表均只有一个元素,且最终需要进位
-
通过代码如下
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){ int plus=0; int result; struct ListNode* pmove1=l1; struct ListNode* pmove2=l2; while(pmove1||pmove2){ result=0; if(pmove1&&pmove2){ result=pmove1->val+pmove2->val+plus; //两数相加以及进位 if(result>=10){ result-=10; plus=1; } else plus=0; pmove1->val=result; if(pmove1->next){ pmove1=pmove1->next; pmove2=pmove2->next; // printf("here1\n"); } else if(pmove2->next){ pmove1->next=pmove2->next; pmove1=pmove1->next; // printf("here2\n"); pmove2=NULL; } else if(plus==1){ struct ListNode* node=(struct ListNode*)malloc(sizeof(struct ListNode)); node->val=1; node->next=NULL; pmove1->next=node; plus=0; // printf("here3\n"); pmove2=pmove2->next; } else{ pmove1=pmove1->next; pmove2=pmove2->next; } } else if(pmove1){ result=pmove1->val+plus; //两数相加以及进位 if(result>=10){ result-=10; plus=1; } else plus=0; pmove1->val=result; if(pmove1->next){ pmove1=pmove1->next; } else if(plus==1){ struct ListNode* node=(struct ListNode*)malloc(sizeof(struct ListNode)); node->val=1; node->next=NULL; pmove1->next=node; plus=0; // printf("here5\n"); } else pmove1=pmove1->next; // printf("here4\n"); } } free(l2); return l1; } -
此代码时间复杂度与空间复杂度较好,但鉴于笔者初学数据结构,代码写的过于冗余,还望大家批评指正。
本文介绍了一种用链表表示非负整数并进行相加的方法,处理了不同长度链表、进位及单元素链表的情况。代码实现了逐位相加并处理进位的过程,确保了时间复杂度和空间复杂度的良好表现,适用于初学者理解链表操作和数值计算。

被折叠的 条评论
为什么被折叠?



