Leetcode2: Add Two Numbers

    xiaoxiao2021-08-14  106

    这道题的难度是简单,说也简单,但也不简单

    说不简单是因为,我为了这个审题的事儿,磨蹭了大半天

    说简单是因为,审题审清楚了以后,写写也没多久

    来看题目,他用一个链表的结构,来代表2个非负数,而非负数是链表中结点的数据元素,不过他是倒序的,也就是头结点是3和4

    然后对应位数两两相加,输出一个也是链表类型的结果

    接下来说觉得不简单的地方,因为,python里面是没有链表结构的,需要自己去实现

    而这道题给你的测试代码是2组列表,[5,4,3] [2,6,4]

    我纠结了大半天的原因是,输入的list怎么变成结点呢?难道要自己造轮子????

    后来去看了别人的解答,没有看具体过程,就是看个开头,怎么处理从list到Node的过程,无一例外全部直接用 l1和l2代表结点了

    奇了怪了。。。。最后研究发现,leetcode在题目里面实际上后台自动把列表转换成ListNode类型了,所以才可以这么用。。。。。

    接下来就比较简单了,链表的最大特点就是一半数据域,一半指针域,指针域指向后面那个结点

    来看代码吧

    # Definition for singly-linked list. # class ListNode(object): # def __init__(self, x): # self.val = x # self.next = None class Solution(object): def addTwoNumbers(self, l1, l2): """ :type l1: ListNode :type l2: ListNode :rtype: ListNode """ if not l1: #如果l1是空的 return l2 #直接返回l2 if not l2: #如果l2是空的 return l1 #直接返回l1 else: new = ListNode(0) #如果两者都是非空的,则建立一个头结点,数据域val=0,指针域暂时为None result = new #复制一份头结点保留在原地开头 carry = 0 #carry的意思是如果2者相加超过10,则进位以后剩余的值是多少 while l1 and l2: #开始循环,当l1和l2都有剩余结点的时候 add = 0 #两个元素相加的值初始为0 add = l1.val + l2.val + carry #两个元素相加的值等于两个元素的值加上进位上来的值 carry = 0 #值在上一轮进位被使用之后,被清0 if add > 9: #如果这一轮的两个元素值相加大于9需要进位 carry = add//10 #carry等于进位值,其实也就是1 add -= 10 #相加的元素在进位之后减去10 new.next = ListNode(add) #将上一个结点和新生成的结点连接起来 new = new.next #并将需要计算的结点位置向前挪动一位,作用和指针一样 l1=l1.next #将l1和l2的结点各自移动一位 l2=l2.next if l1: #如果l1比l2长 while l1: #循环l1到没有结点 add = 0 add = l1.val + carry + 0 #虚拟一个l2的结点元素值为0 carry = 0 if add > 9: carry = add//10 add -= 10 new.next = ListNode(add) new = new.next l1 = l1.next if l2: #如果l2比l1长 while l2: add = 0 add = l2.val + carry + 0 carry = 0 if add > 9: carry = add//10 add2 -= 10 new.next = ListNode(add) new = new.next l2 = l2.next if carry: #如果总的结束之后,还有进位上来的数,则需要新建一个结点进行连接 new.next = ListNode(carry) return result.next #result还是停留在头结点的位置,返回的是他的next,也就是第一个结点

    题目完成,感觉审题比解决要难啊............

    PS: 最后加一段轮子,这个可以实现list和ListNode的相互转换

    class ListNode(object): def __init__(self,val): self.val = val self.next = None def __repr__(self): return str(self.val) def LinkedList(pythonlist): l = ListNode(pythonlist[0]) c = l for i in range(1,len(pythonlist)): l.next = ListNode(pythonlist[i]) l = l.next return c def PythonList(ListNode): l = [] while ListNode != None: l.append(ListNode.val) ListNode = ListNode.next return l class Solution(object): def mergeTwoLists(self,l1,l2): if l1 is None: return l2 if l2 is None: return l1 dummyhead=ListNode(0) dummyhead.next=None p=dummyhead while l1 is not None and l2 is not None: if l1.val<l2.val: p.next=l1 l1=l1.next else: p.next=l2 l2=l2.next p=p.next if l1 is not None: p.next=l1 else: p.next=l2 return dummyhead.next

    转载请注明原文地址: https://ju.6miu.com/read-676331.html

    最新回复(0)