题目要求:
思路:
遍历第一个与第二个链表,把相同位置的相加
设置一个flag,用来标记相加后大于10的部分,下一位再相加时,就要加上flag的值
遍历至一个链表结束
如果此时flag不为0,把未结束的链表当前的第一位加上flag
falg记录相加大于10的部分
直至当前列表也遍历完
如果遍历完,flag仍然不为0,再补一位1
核心代码:
遍历两个链表:
# 把链表1 2 的头赋给h1,h2
h1 = l1
h2 = l2
# 创建新链表,用来保存计算完的数
l3 = ListNode()
h3 = l3
# flag标志两数加完大于9的部分
flag = 0
# 遍历两个链表,h3当前的值为h1+h2去掉十位的部分,flag保存进位,运算完h1,h2,h3移向下一位
while h1 and h2 :
h3.next = ListNode((h1.val + h2.val + flag) % 10)
flag = (h1.val + h2.val + flag) // 10
h1 = h1.next
h2 = h2.next
h3 = h3.next
- 如果链表1或2未遍历完:
#原理如上
if h1 :
while h1 :
h3.next = ListNode((h1.val + flag) % 10)
flag = (h1.val + flag) // 10
h1 = h1.next
h3 = h3.next
# 用elif,如果是h1有未遍历的,遍历结束后就不遍历h2了
elif h2 :
while h2 :
h3.next = ListNode((h2.val + flag) % 10)
flag = (h2.val + flag) // 10
h2 = h2.next
h3 = h3.next
- 如果最后一位相加后,仍需进位:
if flag == 1:
h3.next = ListNode(1)
完整代码:加上判断l1和l2一开始是否为空,如果l1为空,返回l2,如果l2为空,返回l1
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def addTwoNumbers(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
if l1 is None:
return l2
if l2 is None:
return l1
h1 = l1
h2 = l2
l3 = ListNode()
h3 = l3
flag = 0
while h1 and h2 :
h3.next = ListNode((h1.val + h2.val + flag) % 10)
flag = (h1.val + h2.val + flag) // 10
h1 = h1.next
h2 = h2.next
h3 = h3.next
if h1 :
while h1 :
h3.next = ListNode((h1.val + flag) % 10)
flag = (h1.val + flag) // 10
h1 = h1.next
h3 = h3.next
elif h2 :
while h2 :
h3.next = ListNode((h2.val + flag) % 10)
flag = (h2.val + flag) // 10
h2 = h2.next
h3 = h3.next
if flag == 1:
h3.next = ListNode(1)
return l3.next