这道题不难,由于是第一次在力扣上做题所以动作有点慢。
权且记录一下:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers**
做这道题的时候你会想起以前学过的字符串之类的操作,或者是数字电路里加法器实现的操作,这里总体思路上与字符串的大数加法是没有多少区别的,唯一需要注意的是以下几个小要点:
- 防止出现指针瞎指的情况,要弄清楚对应关系,所以建议画画图
- 一定要谨慎地分配内存,这里很容易爆经典错误
- 在指针碰到了NULL的时候我们其实还是可以让他参与进来,我们只要让他保持位置不变,同时赋值使得value为0就可以重新代入原来的等式(很方便的想法:来自评论区)
- 如果l1,l2仅使用一次,不妨释放掉,白茫茫的可真是干净
以及本人的一些还有待提高的部分:
好像时间复杂度挺高的,虽然数量级一样但是还是比很多人慢一些呢。这个其实是因为我每一步都要重新的分配一次空间。。本来是可以避免的,但是我不怎么会应对单向链表指针已经指到NULL的位置却还要在这个链表后面再加几个结点的情况。希望有人能告诉我如何处理,这样我就可以直接把l1链表或者l2链表扩展了,会方便快速很多呢。
以下给出源码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode Node;
typedef struct ListNode* Pnode;
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
Pnode p,q,temp,ret,t;
p=l1;q=l2;
int c=0,s=0,k=0;
ret=(Pnode)malloc(sizeof(Node));//本人的习惯,喜欢搞一个头结点玩玩
ret->next=NULL;ret->val=-1;
temp=ret;
while(p!=NULL||q!=NULL){
k=(p!=NULL?p->val:0)+(q!=NULL?q->val:0)+c;
c=k/10;
s=k%10;//典型加法器操作
t=(Pnode)malloc(sizeof(Node));
temp->next=t;t->val=s;t->next=NULL;temp=temp->next;
if(p!=NULL) p=p->next;if(q!=NULL) q=q->next;
}
if(c){
t=(Pnode)malloc(sizeof(Node));
temp->next=t;t->val=c;t->next=NULL;
}//仍然要考虑高位进位的情况
free(l2);
free(l1);
return ret->next;
}