Leetcode2: Add Two Numbers

来源:互联网 发布:类似炫浪网络社区 编辑:程序博客网 时间:2024/05/17 03:51

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

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

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



来看题目,他用一个链表的结构,来代表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 = Noneclass 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


0 0
原创粉丝点击