1.题目:

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)

输出:7 -> 0 -> 8

原因:342 + 465 = 807

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/add-two-numbers 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2.思路分析

我的思路是先把两个加数的单链表转成正确的数字,然后把相加的结果再转回单链表。

知识点1-单链表

单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。

注意*:Python 中没有单链表的结构定义,只能自己实现。了解该题的单链表用法就行。

单链表转换成数字

def listNode_To_Number(listNodeParameter):

firstTempList = []

#用循环把单链表的数据取出来放firstTempList里

while listNodeParameter != None:

#str()是为了方便下面的join()使用

firstTempList.append(str(listNodeParameter.val))

listNodeParameter = listNodeParameter.next

#用join()把列表转成连续字符串,[::-1]反向字符串,再转成int型

resultNumber = int(''.join(firstTempList)[::-1])

return resultNumber

知识点2-Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串

strList = ['1', '2', '3']

print('-'.join( strList ))#以 - 连接显示新字符串

print(''.join( strList ))#无分隔显示新字符串

#注意:

numberList = [1, 2, 3]

print(''.join( numberList ))#join()没办法处理非字符序列

输出结果:

1-2-3

123

TypeError: sequence item 0: expected str instance, int found

知识点3-Python 反转字符串

#第一种反转方法

#reversed 函数返回一个反转的迭代器。

#reversed(seq) seq--要转换的序列,可以是 tuple, string, list 或 range。

seqList = ['1', '2', '3']

print(list(reversed(seqList)))

#第二种反转方法

#seq[::-1] seq--要转换的序列,可以是 tuple, string, list、等(前面几个类型是验证过可以转换的,其他的有待验证(~ ̄▽ ̄)~)。

print(seqList[::-1])

输出结果:

['3', '2', '1']

['3', '2', '1']

数字转换成单链表

def Number_To_listNode(numberOfParameter):

ResList = ListNode(int(numberOfParameter[0]))

resultListNode = ResList

for i in range(1, len(numberOfParameter)):

ResList.next = ListNode(int(numberOfParameter[i]))

ResList = ResList.next

return resultListNode

思考:

单链表的操作可以参考网上大神们关于 Python 单链表的操作,感觉自己不是很讲得清楚,就不误人子弟了。

3.完整示例

# Definition for singly-linked list.

# class ListNode:

# def __init__(self, x):

# self.val = x

# self.next = None

class Solution:

def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:

def listNode_To_Number(listNodeParameter):

firstTempList = []

while listNodeParameter != None:

firstTempList.append(str(listNodeParameter.val))

listNodeParameter = listNodeParameter.next

resultNumber = int(''.join(firstTempList)[::-1])

return resultNumber

def Number_To_listNode(numberOfParameter):

ResList = ListNode(int(numberOfParameter[0]))

resultListNode = ResList

for i in range(1, len(numberOfParameter)):

ResList.next = ListNode(int(numberOfParameter[i]))

ResList = ResList.next

return resultListNode

resultSum = listNode_To_Number(l1) + listNode_To_Number(l2)

return Number_To_listNode(str(resultSum)[::-1])