地址
https://leetcode.cn/problems/add-two-numbers/description/?envType=study-plan-v2&envId=top-100-liked
动画:https://leetcode.cn/problems/add-two-numbers/solutions/2327008/dong-hua-jian-ji-xie-fa-cong-di-gui-dao-oe0di/
代码(迭代法)
基本思路:
从最低位(链表头部)开始,逐位相加。
对于每一位,我们加上两个数字的对应位(如果存在)和上一位的进位。
计算出的和可能大于 9,所以我们需要处理进位。
将和的个位数作为新链表的当前位,十位数(如果有)作为下一位的进位。
移动到下一位继续计算,直到所有位都处理完毕且没有剩余进位。
# Definition for singly-linked list.
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
dummy = ListNode(0) # 哨兵节点
current = dummy
carry = 0 #进位
# 循环继续的条件:
# - l1 还有节点,或
# - l2 还有节点,或
# - 还有进位需要处理
while l1 or l2 or carry:
val1 = l1.val if l1 else 0 # 如果 l1 存在,取其值;否则用 0 代替
val2 = l2.val if l2 else 0
total = val1 + val2 + carry # 计算当前位的总和,包括两个链表的当前值和上一位的进位
carry = total // 10 # 计算新的进位,整除 10 得到
current.next = ListNode(total % 10) # 创建新节点,其值为总和对 10 取模的结果(即保留个位数)
current = current.next
l1 = l1.next if l1 else None # 如果 l1 还有下一个节点,移动到下一个;否则置为 None
l2 = l2.next if l2 else None
return dummy.next
def stringToListNode(input):
# 解析输入的列表字符串
numbers = eval(input)
# 将列表转换为链表
dummyRoot = ListNode(0)
ptr = dummyRoot
for number in numbers:
ptr.next = ListNode(number)
ptr = ptr.next
ptr = dummyRoot.next
return ptr
def listNodeToString(node):
result = []
while node:
result.append(node.val)
node = node.next
return str(result)
def main():
import sys
# 读取输入
line = sys.stdin.readline().strip()
l1_str, l2_str = line.split(', ')
l1 = stringToListNode(l1_str.split('=')[1].strip())
l2 = stringToListNode(l2_str.split('=')[1].strip())
# 计算结果
ret = Solution().addTwoNumbers(l1, l2)
# 输出结果
out = listNodeToString(ret)
print(out)
if __name__ == '__main__':
main()
234. 回文链表
# Definition for singly-linked list.
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution:
def isPalindrome(self, head: ListNode) -> bool:
vals=[]
cur=head
while cur:
vals.append(cur.val)
cur=cur.next
return vals==vals[::-1]
def stringToListNode(input):
# 解析输入的列表字符串
numbers = eval(input)
# 将列表转换为链表
dummyRoot = ListNode(0)
ptr = dummyRoot
for number in numbers:
ptr.next = ListNode(number)
ptr = ptr.next
ptr = dummyRoot.next
return ptr
def main():
import sys
# 读取输入
line = sys.stdin.readline().strip()
# l1_str, l2_str = line.split(', ')
l1 = stringToListNode(line.split('=')[1].strip())
# l2 = stringToListNode(l2_str.split('=')[1].strip())
# 计算结果
ret = Solution().isPalindrome(l1)
print(ret)
if __name__ == '__main__':
main()