LeetCode 2 - Add Two Numbers
2018-06-29 本文已影响0人
flycser
Description
You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Example
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
Explanation: 342 + 465 = 807.
Solution
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def addTwoNumbers(self, l1, l2):
carry_bit = 0 # 进位值
cur_bit = 0 # 当前位数值
prev_node = ListNode(0)
start_node = prev_node
cur_node_1 = l1
cur_node_2 = l2
while True:
if cur_node_1 and cur_node_2: # 如果两个链表当前节点均不为空
prev_node.next = ListNode(0)
val = cur_node_1.val + cur_node_2.val + carry_bit
cur_bit = val % 10
carry_bit = val // 10
# print(cur_node_1.val, cur_node_2.val, cur_bit, carry_bit)
prev_node.next.val = cur_bit
prev_node = prev_node.next
# print_linked_list(start_node)
else:
break
cur_node_1 = cur_node_1.next # 指向链表下一个节点
cur_node_2 = cur_node_2.next # 指向链表下一个节点
if cur_node_1 is None and cur_node_2 is None and carry_bit < 1:
# print_linked_list(start_node)
pass
elif cur_node_1:
while True:
val = cur_node_1.val + carry_bit
cur_bit = val % 10
carry_bit = val // 10
prev_node.next = ListNode(0)
prev_node.next.val = cur_bit
prev_node = prev_node.next
cur_node_1 = cur_node_1.next
if cur_node_1 is None:
break
elif cur_node_2:
while True:
val = cur_node_2.val + carry_bit
cur_bit = val % 10
carry_bit = val // 10
prev_node.next = ListNode(0)
prev_node.next.val = cur_bit
prev_node = prev_node.next
cur_node_2 = cur_node_2.next
if cur_node_2 is None:
break
if carry_bit > 0:
prev_node.next = ListNode(0)
prev_node.next.val = carry_bit
prev_node = prev_node.next
return start_node.next
辅助代码
def print_linked_list(l1):
# 打印链表
while True:
print(l1.val, end=' ')
l1 = l1.next
if l1 is None:
break
print()
备注
该问题旨在利用链表数据结构模拟带进位加法。解题过程注意进位及最高位各种情形的处理。