leetcode02两数相加
一、题目
给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头。示例:
1输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
2输出:7 -> 0 -> 8
3原因:342 + 465 = 807
二、题目分析
最初的并未看清链表的提示。只是将其当成一个数组来处理了,按数组的思想处理的代码和执行结果如下:
1#!/usr/bin/env python
2# coding=utf8
3# ===============================================================================
4# Copyright (C) 2018 www.361way.com site All rights reserved.
5#
6# Filename :02.py
7# Author :yangbk <itybku>
8# Create Time :2018-08-16 19:00
9# Description :
10# ===============================================================================
11l1 = [2,4,3]
12l2 = [5,6,4]
13def addstr(l):
14 a = ''
15 for i in l:
16 i = str(i)
17 a = a + i
18 return a
19n1 = addstr(l1)
20n2 = addstr(l2)
21n3 = int(n1) + int(n2)
22print n1,n2,n3
23print list(''.join(str(n3)[::-1]))
24[root@localhost leetcode]# python 02.py
25243 564 807
26['7', '0', '8']
不过将代码提交后,不通过。
三、链表(Linked lists)
上面题目提到了一个非常有用的概念链表,其一般只存在于更底层的高级语言中,如C、JAVA、Golang等。其一般都是和指针相关的。而且上面提到的是单向链表,这里就截图一个C++实现的单向链表的示意图:
单向链表很简单,链表的创建就是添加结点到链表的最后,开始是添加一个结点到head结点后面,然后添加一个结点到上次添加的结点后面,每次新建的结点的指针总是指向NULL指针。更多链表相关内部可以参考:
四、功能实现
对位相加,设置进位位,重点在于如何写单链表。其代码如下:
1class Solution(object):
2 def addTwoNumbers(self, l1, l2):
3 """
4 :type l1: ListNode
5 :type l2: ListNode
6 :rtype: ListNode
7 """
8 nHead, flag = ListNode(0), 0
9 head = nHead
10 while flag or l1 or l2:
11 node = ListNode(flag)
12 if l1:
13 print node.val
14 node.val += l1.val
15 print node.val
16 print '---------'
17 l1 = l1.next
18 if l2:
19 node.val += l2.val
20 l2 = l2.next
21 print node.val
22 print '***********'
23 flag = node.val // 10
24 node.val %= 10
25 print flag,node.val
26 print '========'
27 head.next, head = node, node
28 return nHead.next
上面加了很多print代码,主要方便打印相关信息。实际执行的时候并不需要。上面的代码只是做了进位处理,并没有反转操作。实现执行的时候打印出来结果如下:
如何反向逆转代码如下:
1class ListNode(object):
2 def __init__(self, x):
3 self.val = x
4 self.next = None
5def reverse(head):
6 if head is None or head.next is None:
7 return head
8 pre = None
9 cur = head
10 h = head
11 while cur:
12 h = cur
13 tmp = cur.next
14 cur.next = pre
15 pre = cur
16 cur = tmp
17 return h
18class Solution(object):
19 def addTwoNumbers(self, l1, l2):
20 newl1=reverse(l1)
21 newl2=reverse(l2)
22 nHead, flag = ListNode(0), 0
23 head = nHead
24 while newl1 or newl2 or flag:
25 node = ListNode(flag)
26 if newl1:
27 node.val += newl1.val
28 newl1 = newl1.next
29 if l2:
30 node.val += newl2.val
31 newl2 = newl2.next
32 flag = node.val // 10
33 node.val %= 10
34 head.next, head = node, node
35 newHead = reverse(nHead)
36 print newHead.val
37 print newHead.next.val
38 print newHead.next.next.val
39l1 = ListNode(2)
40l1.next = ListNode(4)
41l1.next.next = ListNode(3)
42l2 = ListNode(5)
43l2.next = ListNode(6)
44l2.next.next = ListNode(4)
45p = Solution()
46p.addTwoNumbers(l1, l2)
上面的关于链表部分的代码不是我写的,来自互联网。因为python里不存在指针的概念。而且之前在使用python的时候也从没有关系过链表,其对链表的实现不同于其他高级语言。
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/linked-lists/5798.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.