编程低能儿,兴起做leetcode,不知道能坚持几天,就当复习下C和学习下python。
题目:给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
思路:
题目给的比较友好,数字按照逆序来存储,做加法的时候只需要遍历这个链表即可,C已经学了很久,结构体,链表的一些知识需要稍微复习下。
解题的思路是先比较找出两个链表中比较长的一个,对于两个链表中相等的部分做加法和进位比较简单,唱的那部分通过移动指针,单独考虑,一定要考虑前面进位产生的影响,一开始的代码没有考虑,出现了错误
C:
. 成员运算符 与 -> 的区分
1、C 中 结构的定义 可以为 :
struct point {
int x;
int y;
};
通过 结构名.成员 来进行引用 。
struct point *pp; 定义一个指向 struct point 类型对象的指针。
*pp 为该结构 (*pp.x)与(*pp.y)为该结构的成员
(*pp.x)中的括号为必须的, 因为 pp为指向结构的指针,也可以用:
p->结构成员 来调用
#include<stdio.h>
#include<stdlib.h>
#include <malloc.h>
//The structure given by the problem
struct ListNode{
int val;
struct ListNode *next;
};
// Compare two list and return the long list
struct ListNode* compareTwoList(struct ListNode* l1, struct ListNode* l2)
{
struct ListNode *a=l1,*b=l2;
int n=0;
while(a->next!=NULL&&b->next!=NULL)
{
a=a->next;
b=b->next;
n++;
}
//printf("N=%d\n",n);
if(a->next==NULL)
{
return l2;
}
if(b->next==NULL)
{
return l1;
}
}
//printList
void printList(struct ListNode* l1)
{
struct ListNode *a=l1;
while(a!=NULL)
{
printf("%d",a->val);
a=a->next;
}
printf("\n");
}
//addtowNumbers
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
struct ListNode *result;
result=(struct ListNode *)malloc(sizeof(struct ListNode));
struct ListNode *a=l1,*b=l2,*c=result;
struct ListNode *longlist=compareTwoList(l1,l2);
printList(a);
printList(b);
//printList(shortList);
int flag=0;
while(a!=NULL&&b!=NULL)
{
printf("!!!\n");
struct ListNode* s=(struct ListNode *)malloc(sizeof(struct ListNode));
s->next=NULL;
int sum=a->val+b->val+flag;
if(sum>=10)
{
s->val=sum-10;
flag=1;
}
else
{
s->val=sum;
flag=0;
}
c->next=s;
c=c->next;
a=a->next;
b=b->next;
longlist=longlist->next;
}
while(longlist!=NULL)
{
struct ListNode* s=(struct ListNode *)malloc(sizeof(struct ListNode));
s->next=NULL;
int sum=longlist->val+flag;
if(sum>=10){
s->val=sum-10;
flag=1;
}else{
s->val=sum;
flag=0;
}
c->next=s;
c=c->next;
longlist=longlist->next;
}
//judge extra 1
if(flag==1)
{
struct ListNode* s=(struct ListNode *)malloc(sizeof(struct ListNode));
s->next=NULL;
s->val=flag;
c->next=s;
c=c->next;
}
return result->next;
}
// main function
void main(){
//原谅我用这么蠢得方式创建一个链表
struct ListNode* l1=(struct ListNode *)malloc(sizeof(struct ListNode));
l1->val=5;
struct ListNode* q=(struct ListNode *)malloc(sizeof(struct ListNode));
l1->next=q;
q->val=4;
struct ListNode* p=(struct ListNode *)malloc(sizeof(struct ListNode));
q->next=p;
p->val=3;
p->next=NULL;
struct ListNode* l2=(struct ListNode *)malloc(sizeof(struct ListNode));
l2->val=2;
struct ListNode* s=(struct ListNode *)malloc(sizeof(struct ListNode));
s->val=6;
s->next=NULL;
l2->next=s;
printList(addTwoNumbers(l1,l2));
}
python
主要注意类的创建于调用
#The class of problem
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
##print list
def printList(list):
while(list):
print(list.val)
list=list.next
#create two test list
def creatList():
l1=ListNode(5)
a=ListNode(3)
b=ListNode(4)
l1.next=a
a.next=b
l2=ListNode(8)
c=ListNode(1)
l2.next=c
return l1,l2
class Solution :
def addTwoNumbers(self, l1: ListNode, l2: ListNode):
flag=0
result=ListNode(0)
s=result
while(l1 or l2):
x=l1.val if l1 else 0
y=l2.val if l2 else 0
sum=x+y+flag
if(sum>=10):
flag=1
else:
flag=0
s.next=ListNode(sum%10)
if (l1 != None): l1 = l1.next
if (l2 != None): l2 = l2.next
s=s.next
if (flag > 0):
s.next = ListNode(1)
return result.next
if __name__ == '__main__':
l1,l2=creatList()
#printList(l1)
#printList(l2)
solution=Solution()
l3=solution.addTwoNumbers(l1,l2)
printList(l3)
运行结果:
感觉写代码还是没怎么考虑时间复杂的和空间复杂度,C代码中先求长链表那部分估计有点鸡肋。。
来源:CSDN
作者:卷卷卷不动
链接:https://blog.csdn.net/qq_43245866/article/details/104117377