leetcode02两数相加

一、题目

给定两个<strong>非空链表</strong>来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头。示例:



<br />
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

二、题目分析

最初的并未看清链表的提示。只是将其当成一个数组来处理了,按数组的思想处理的代码和执行结果如下:



<br />
#!/usr/bin/env python
# coding=utf8
# ===============================================================================
#   Copyright (C) 2018 www.361way.com site All rights reserved.
#
#   Filename      :02.py
#   Author        :yangbk 
#   Create Time   :2018-08-16 19:00
#   Description   :
# ===============================================================================
l1 = [2,4,3]
l2 = [5,6,4]
def addstr(l):
  a = ''
  for i in l:
    i = str(i)
    a = a + i
  return a
n1 = addstr(l1)
n2 = addstr(l2)
n3 = int(n1) + int(n2)
print n1,n2,n3
print  list(''.join(str(n3)[::-1]))
[root@localhost leetcode]# python 02.py
243 564 807
['7', '0', '8']
不过将代码提交后,不通过。

三、链表(Linked lists)

上面题目提到了一个非常有用的概念链表,其一般只存在于更底层的高级语言中,如C、JAVA、Golang等。其一般都是和指针相关的。而且上面提到的是单向链表,这里就截图一个C++实现的单向链表的示意图:



<img src="https://www.361way.com/wp-content/uploads/2018/08/linkedlists.png" width="502" height="248" title="linked lists" alt="linked lists" />



单向链表很简单,链表的创建就是添加结点到链表的最后,开始是添加一个结点到head结点后面,然后添加一个结点到上次添加的结点后面,每次新建的结点的指针总是指向NULL指针。



更多链表相关内部可以参考:



<a href="https://www.jianshu.com/p/c78c70c92a6c" target="_blank" rel="noopener">链表</a>



<a href="https://blog.csdn.net/fisherwan/article/details/25796625" target="_blank" rel="noopener">链表(单向、双向、单向循环、双向循环)学习过程总结</a>



<a href="https://blog.csdn.net/mianhuantang848989/article/details/72393561?locationNum=8&fps=1" target="_blank" rel="noopener">C语言通用双向循环链表操作函数集</a>



<a href="http://www.cnblogs.com/yupeng/p/3413763.html" target="_blank" rel="noopener">python 数据结构之单链表的实现</a>

四、功能实现

对位相加,设置进位位,重点在于如何写单链表。其代码如下:



<br />
class Solution(object):
    def addTwoNumbers(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        nHead, flag = ListNode(0), 0
        head = nHead
        while flag or l1 or l2:
            node = ListNode(flag)
            if l1:
                print node.val
                node.val += l1.val
                print node.val
                print '---------'
                l1 = l1.next
            if l2:
                node.val += l2.val
                l2 = l2.next
            print node.val
            print '***********'
            flag = node.val // 10
            node.val %= 10
            print flag,node.val
            print '========'
            head.next, head = node, node
        return nHead.next
上面加了很多print代码,主要方便打印相关信息。实际执行的时候并不需要。上面的代码只是做了进位处理,并没有反转操作。实现执行的时候打印出来结果如下:



<img src="https://www.361way.com/wp-content/uploads/2018/08/listnode.png" width="596" height="547" title="listnode" alt="listnode" />



如何反向逆转代码如下:



<br />
class ListNode(object):
    def __init__(self, x):
        self.val = x
        self.next = None
def reverse(head):
    if head is None or head.next is None:
        return head
    pre = None
    cur = head
    h = head
    while cur:
        h = cur
        tmp = cur.next
        cur.next = pre
        pre = cur
        cur = tmp
    return h
class Solution(object):
    def addTwoNumbers(self, l1, l2):
        newl1=reverse(l1)
        newl2=reverse(l2)
        nHead, flag = ListNode(0), 0
        head = nHead
        while newl1 or newl2 or flag:
            node = ListNode(flag)
            if newl1:
                node.val += newl1.val
                newl1 = newl1.next
            if l2:
                node.val += newl2.val
                newl2 = newl2.next
            flag = node.val // 10
            node.val %= 10
            head.next, head = node, node
        newHead = reverse(nHead)
        print newHead.val
        print newHead.next.val
        print newHead.next.next.val
l1 = ListNode(2)
l1.next = ListNode(4)
l1.next.next = ListNode(3)
l2 = ListNode(5)
l2.next = ListNode(6)
l2.next.next = ListNode(4)
p = Solution()
p.addTwoNumbers(l1, l2)
上面的关于链表部分的代码不是我写的,来自互联网。因为python里不存在指针的概念。而且之前在使用python的时候也从没有关系过链表,其对链表的实现不同于其他高级语言。

leetcode02两数相加》有2条评论

  1. 想知道你的python文件头部注释是自动生成的还是手动填写的啊

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注