练习内容:
1.LeetCode206-反转链表
反转一个单链表
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
示例:
| 输入: | 1->2->3->4->5->NULL |
|---|---|
| 输出: | 5->4->3->2->1->NUL |
题目来自leetcode
迭代法
python代码如下:
class Solution:
def reverseList(self, head: ListNode):
# LeetCode迭代法:
if not head:
return None
cur = head
pre = None
while cur:
cur.next, pre, cur = pre, cur, cur.next
return pre
代码执行后:

时间复杂度:
O(n)
空间复杂度:
O(1)
递归法
python代码如下:
class Solution:
def reverseList(self, head: ListNode):
# 递归法:
if not head or not head.next:
return head
new_head = self.reverseList(head.next)
head.next.next = head
head.next = None
return new_head
代码执行后:

时间复杂度:
O(n)
空间复杂度:
O(n)
2.两数相加
给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

题目来自leetcode
python代码如下:
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
# 创建一个新链表的头结点,内容是l1和l2的和
head = ListNode(l1.val + l2.val)
cur = head
while l1.next or l2.next:
# 遍历两个链表,直到链表末尾
l1 = l1.next if l1.next else ListNode()
l2 = l2.next if l2.next else ListNode()
cur.next = ListNode(l1.val + l2.val + cur.val // 10)
cur.val = cur.val % 10
# cur向后遍历
cur = cur.next
# 循环结束,如果首位是两位数,新增结点
if cur.val >= 10:
cur.next = ListNode(cur.val // 10)
cur.val = cur.val % 10
return head
# 代码原作者:edelweisskoko
# 链接:https://leetcode-cn.com/problems/add-two-numbers/solution/2-liang-shu-xiang-jia-yi-dong-jie-fa-jin-9obh/
# 来源:力扣(LeetCode)
代码执行后:

时间复杂度:
O(max(m,n))
空间复杂度:
O(max(m,n))
总结
在做本周的两道题前,需要将链表的知识进行系统的学习。
链表的知识确实是容易绕在里面。各种next,反转,想要熟练掌握,还是需要多敲代码。巩固知识点。
链表的五个常规操作:
- 单链表反转
- 链表中的环检测
- 两个有序的链表合并
- 删除链表倒数第n个结点
- 求链表的中间结点
具体内容和代码可以在《自学数据结构之链表(Python)》看到
将这五个常规操作熟练掌握,就不会蒙圈了!
- 本周两题任务完成

本文通过LeetCode的206题(反转链表)和两数相加问题,深入探讨链表的常见操作,包括迭代与递归解法。学习并熟练掌握单链表反转、链表环检测、两链表合并、删除倒数第n节点及找链表中间节点等核心技巧,有助于提升链表问题的解决能力。

被折叠的 条评论
为什么被折叠?



