2. 两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
解题思路:
先创建一个新链表的头节点
遍历l1和l2两个链表,只要有一个链表还没有遍历到末尾,就继续遍历
每次遍历生成一个当前节点l3的下一个节点,其值为两链表对应节点的和再加上当前节点l3产生的进位carry
更新进位后的当前节点l3的值
循环结束后,因为首位可能产生进位,如果l3.val是两位数的话,新增一个节点
最后返回头节点的next节点
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
head = ListNode(0)
l3 = head
carry = 0
while l1 or l2:
if not l1:
sum = l2.val + carry
l2 = l2.next
if not l2:
sum = l2 + carry
l1 = l1.next
else:
sum = l1.val + l2.val + carry
carry = sum // 10
l1 = l1.next
l2 = l2.next
l3.next = ListNode(sum)
l3.val = l3.val % 10
l3 = l3.next
if l3.val >= 10:
l3.next = ListNode(1)
l3.val = l3.val % 10
return head.next
206. 反转链表
递归方法:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
# # 递归终止条件是当前为空,或者下一个节点为空
if not head.next or not head:
return head
# 当执行到最后一层时,new_head是5, cur = 5
new_head = self.reverseList(head.next)
# 层层返回从4→3→2→1
# 而head是4,head的下一个是5,下下一个是空
# 所以head.next.next 就是5->4
# cur = 5→4
head.next.next = head
# cur = 5→4→null
# 防止链表循环,需要将head.next设置为空
head.next = None
# 每层递归函数都返回new_head,也就是最后一个节点
return new_head
迭代:
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
pre = None # 指向已反转好的链表的最后一个节点,最开始没有反转,指向None
cur = head # 指向待反转链表的第一个节点,最开始第一个节点为head
nex = None # 指向待反转链表的第二个节点,目的是保存链表
while cur:
nex = cur.next # 保存下一个节点数据
cur.next = pre # 未反转链表的第一个节点的下一个指针指向已反转链表的最后一个节点
# pre cur指针向后移
pre = cur
cur = nex
return pre # 返回反转后的头节点