目录
1. 题目描述
2. 解题分析? ? ? ??
3. 代码实现
1. 题目描述
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1: 输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807.
示例 2: 输入:l1 = [0], l2 = [0] 输出:[0]
示例 3: 输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] 输出:[8,9,9,9,0,0,0,1] ? 提示: 每个链表中的节点数在范围 [1, 100] 内 0 <= Node.val <= 9 题目数据保证列表表示的数字不含前导零
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/add-two-numbers 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题分析? ? ? ??
????????由于输入的两个链表都是逆序存储数字的位数,即根节点存储最低位。因此两个链表中同一位置的数字可以直接相加,运算规则跟我们熟知的小学数学学的加法运算是直观相同。
????????同时遍历两个链表,逐位计算它们的和,并与从上一位进位到当前位置的进位值相加。输入出结果作为一个新的节点加入到结果链表中,另外还要给出传递给下一位的进位制。
? ? ? ? 有两个细节需要考虑:
- 两个链表的长度可能不同,可以认为较短的链表的后面有若干个 00,对应于其代表的数字的高位位0
- 链表遍历结束后,最高位计算如果有进位的话,还需要在答案链表的后面附加一个节点,节点的值即为这个进位值
3. 代码实现
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution:
def append_ListNode(self, val, head):
if head != None:
curNode = head
while curNode.next is not None:
curNode = curNode.next
curNode.next = ListNode(val, None)
else:
head = ListNode(val, None)
return head
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
head = None
c,p1,p2 = 0,l1,l2
while p1 != None or p2 != None:
op1 = 0 if p1==None else p1.val
op2 = 0 if p2==None else p2.val
s = op1 + op2 + c
val,c = s%10, s//10
head = self.append_ListNode(val, head)
if p1 != None:
p1 = p1.next
if p2 != None:
p2 = p2.next
if c > 0:
head = self.append_ListNode(c, head)
return head
????????和leetcode的很多与特殊的数据结构相关的题目一样,本题的解函数的输入是单链表,但是题目给的输入是链表的列表表示。所以在本地调试时,首先要先将列表表示转换为真正的单链表。然后当然还需要。
? ? ? ? 以下是包括这些helper函数的测试代码,供大家参考。
def create_SinglyLinkedList(valList):
head = ListNode(valList[0])
for k in range(1, len(valList)):
append_ListNode(valList[k], head)
return head
# prints singly linked list values.
def print_linkedlist(head):
assert(head is not None)
print("Single linked list: ", end='')
current_ListNode = head
print("head -->", end='')
while(current_ListNode is not None):
print(current_ListNode.val, "-->", end='')
current_ListNode = current_ListNode.next
print("End")
if __name__ == '__main__':
sln = Solution()
l1 = create_SinglyLinkedList([2,4,3])
l2 = create_SinglyLinkedList([5,6,4])
rslt = sln.addTwoNumbers(l1, l2)
print_linkedlist(rslt)
l1 = create_SinglyLinkedList([0])
l2 = create_SinglyLinkedList([0])
rslt = sln.addTwoNumbers(l1, l2)
print_linkedlist(rslt)
l1 = create_SinglyLinkedList([0])
l2 = create_SinglyLinkedList([2])
rslt = sln.addTwoNumbers(l1, l2)
print_linkedlist(rslt)
l1 = create_SinglyLinkedList([9,9,9,9,9,9,9])
l2 = create_SinglyLinkedList([9,9,9,9])
rslt = sln.addTwoNumbers(l1, l2)
print_linkedlist(rslt)
l1 = create_SinglyLinkedList([1,0,1,9,8,9,9,9])
l2 = create_SinglyLinkedList([9,9,8,2,4,5])
rslt = sln.addTwoNumbers(l1, l2)
print_linkedlist(rslt)
回到主目录:笨牛慢耕的Leetcode解题笔记(动态更新。。。)https://chenxiaoyuan.blog.csdn.net/article/details/123040889?
|