一本通1013:温度表达转化

vc6,sizeof(__int64)无法显示出8

  返回  

代码-链表系列(更新中)

2021/8/20 23:17:52 浏览:

“抱佛脚”系列(代码部分); 所有代码均基于 Python3;
记号 LC{xx} 表示 Leetcode 第 xx 题,例如 LC20 表示 Leetcode 第 20题。

题目索引

  • 链表定义
  • 高频题目
    • LC206 - 反转链表I
    • LC92 - 反转链表II(区间内)
    • LC2 - 两数相加

链表定义

单向链表

class ListNode:
	def __init__(self, val=0, next=None):
	self.val = val
	self.next = next

双向链表

class ListNode:
	def __init__(self, val=0, pre=None, next=None):
	self.val = val
	self.next = next
	self.pre = pre

高频题目

LC206 - 反转链表I

原题链接:https://leetcode-cn.com/problems/reverse-linked-list/
给你单链表的头节点 head,请你反转链表,并返回反转后的链表。

在这里插入图片描述

要点:

  • 双指针记录:上一指针pre和当前指针cur
  • 指针交换时,引入 nxt 作为临时指针,防止指针丢失
  • 记住要处理好边界条件,比如针对空链表
  • while循环cur

“老实人”版代码:

class Solution:
	def reversedList(self, head: ListNode) -> ListNode:
		if head is None:
			return
		pre, cur = None, head
		while cur:
			nxt = cur.next
			cur.next = pre
			pre = cur
			cur = nxt
		return pre

简洁版:

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        if head is None:
            return
        pre, cur = None, head
        while cur:
            nxt, cur.next, pre, cur = cur.next, pre, cur, cur.next
        return pre

LC92 - 反转链表II(区间内)

链接:https://leetcode-cn.com/problems/reverse-linked-list-ii

反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。

在这里插入图片描述

示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL

⚠️要点

  • 双指针:上一指针pre和当前指针cur
  • i 记住当前指针位置,while 分4种情况:
    1. 前进
    2. 区间左端:记住此时的pre和cur
    3. 反转(同上)
    4. 到达区间右端,跳出循环 (最后把链表接上)
  • 注意边界的处理:
    • 检查输入是否符合
    • 使用“哑节点”dummy可以避免结尾的一次边界处理。
class Solution:
    def reverseBetween(self, head: ListNode, left: int, right: int) -> ListNode:
        if left >= right or head is None:
            return head
        dummy = ListNode(next=head)
        i = 0  # (i + 1) is cur's location
        pre, cur = dummy, head
        while cur:
            i += 1
            if i < left:
                pre, cur = cur, cur.next
            elif i == left:
                left_node, left_next = pre, cur
                left_node.next = None 
                pre, cur = cur, cur.next
            elif left < i <= right:
                nxt, cur.next, cur, pre = cur.next, pre, cur.next, cur
            else:
                break
        left_node.next, left_next.next = pre, cur
        return dummy.next    	

LC2 - 两数相加

链接:https://leetcode-cn.com/problems/add-two-numbers

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

示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

在这里插入图片描述

⚠️要点

  • 递归:运行快,但是吃内存
    • 四种情况分别讨论,不要闲麻烦
  • 不写递归:运行快,不吃内存
    • 先考虑做初始加法;
    • 第一个 while 循环,考虑两个ListNode.next均不为None的情况;
    • 第二个 while 循环,处理一个ListNode 与进位 up=1 的情况;
    • 最后还有一次进位判断

(明天再写)

class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
    

联系我们

如果您对我们的服务有兴趣,请及时和我们联系!

服务热线:18288888888
座机:18288888888
传真:
邮箱:888888@qq.com
地址:郑州市文化路红专路93号