【leetcode练习1】 两数相加—C 、python实现

我的梦境 提交于 2020-01-31 05:18:55
   编程低能儿,兴起做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代码中先求长链表那部分估计有点鸡肋。。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!