给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 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语言中链表的定义、链表的取值、链表的初始化。
学习链接:
链表学习: