<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Leetcode刷题记录 on On My Way</title>
    <link>https://tuanzi-wow.cn/leetcode%E5%88%B7%E9%A2%98%E8%AE%B0%E5%BD%95/</link>
    <description>Recent content in Leetcode刷题记录 on On My Way</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <lastBuildDate>Sun, 06 Sep 2026 00:00:00 +0800</lastBuildDate>
    <atom:link href="https://tuanzi-wow.cn/leetcode%E5%88%B7%E9%A2%98%E8%AE%B0%E5%BD%95/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>HOT100 · 普通数组</title>
      <link>https://tuanzi-wow.cn/leetcode%E5%88%B7%E9%A2%98%E8%AE%B0%E5%BD%95/hot100/hot100-array/</link>
      <pubDate>Sun, 06 Sep 2026 00:00:00 +0800</pubDate>
      <guid>https://tuanzi-wow.cn/leetcode%E5%88%B7%E9%A2%98%E8%AE%B0%E5%BD%95/hot100/hot100-array/</guid>
      <description>HOT100 普通数组专题：合并区间、轮转数组、除自身以外数组的乘积与缺失的第一个正数。</description>
      <content:encoded><![CDATA[<h3 id="1合并区间">1.合并区间</h3>
<h4 id="题目描述">题目描述：</h4>
<p>以数组 <code>intervals</code> 表示若干个区间的集合，其中单个区间为 <code>intervals[i] = [starti, endi]</code> 。请你合并所有重叠的区间，并返回 <em>一个不重叠的区间数组，该数组需恰好覆盖输入中的所有区间</em> 。</p>
<p><strong>示例 1：</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">输入：intervals = [[1,3],[2,6],[8,10],[15,18]]
</span></span><span class="line"><span class="cl">输出：[[1,6],[8,10],[15,18]]
</span></span><span class="line"><span class="cl">解释：区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>示例 2：</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">输入：intervals = [[1,4],[4,5]]
</span></span><span class="line"><span class="cl">输出：[[1,5]]
</span></span><span class="line"><span class="cl">解释：区间 [1,4] 和 [4,5] 可被视为重叠区间。
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>示例 3：</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">输入：intervals = [[4,7],[1,4]]
</span></span><span class="line"><span class="cl">输出：[[1,7]]
</span></span><span class="line"><span class="cl">解释：区间 [1,4] 和 [4,7] 可被视为重叠区间。
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>提示：</strong></p>
<ul>
<li><code>1 &lt;= intervals.length &lt;= 104</code></li>
<li><code>intervals[i].length == 2</code></li>
<li><code>0 &lt;= starti &lt;= endi &lt;= 104</code></li>
</ul>
<h4 id="解1排序">解1.排序</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def merge(self, intervals: List[List[int]]) -&gt; List[List[int]]:
</span></span><span class="line"><span class="cl">        intervals.sort(key=lambda x:x[0])
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        if len(intervals)==1:
</span></span><span class="line"><span class="cl">            return intervals
</span></span><span class="line"><span class="cl">        ans=[]
</span></span><span class="line"><span class="cl">        ans.append(intervals[0])
</span></span><span class="line"><span class="cl">        cur=0
</span></span><span class="line"><span class="cl">        for i in range(1,len(intervals)):
</span></span><span class="line"><span class="cl">            if intervals[i][0]&lt;=ans[-1][1]:
</span></span><span class="line"><span class="cl">                ans[-1][1] = max(ans[-1][1], intervals[i][1])
</span></span><span class="line"><span class="cl">            else:
</span></span><span class="line"><span class="cl">                ans.append(intervals[i])
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        return ans   
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="解2">解2.</h4>
<p>通过一个cnt数组记录落位，cnt[i]&gt;1的连续区间即为最终的区间
方法：对于一个区间[start,end]，从cnt[start],cnt[start+1],&hellip;,cnt[end]全部加1
缺陷：[1,2],[3,4]本无法合并，按上述方法却可以合并，解决：*2</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="k">class</span> <span class="n">Solution</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="k">def</span> <span class="nf">merge</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">intervals</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">List</span><span class="p">[</span><span class="ne">int</span><span class="p">]])</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">List</span><span class="p">[</span><span class="ne">int</span><span class="p">]]:</span>
</span></span><span class="line"><span class="cl">        <span class="n">mx</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">intervals</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="n">diff</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="p">(</span><span class="n">mx</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="n">start</span><span class="p">,</span> <span class="n">end</span> <span class="ow">in</span> <span class="n">intervals</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="c1"># 把区间 [start*2, end*2] 增加 1</span>
</span></span><span class="line"><span class="cl">            <span class="n">diff</span><span class="p">[</span><span class="n">start</span> <span class="o">*</span> <span class="mi">2</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">            <span class="n">diff</span><span class="p">[</span><span class="n">end</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">-=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="n">ans</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl">        <span class="n">sum_d</span> <span class="o">=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">        <span class="n">start</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span>  <span class="c1"># -1 表示尚未遇到合并后的区间左端点</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">enumerate</span><span class="p">(</span><span class="n">diff</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">            <span class="n">sum_d</span> <span class="o">+=</span> <span class="n">d</span>  <span class="c1"># 计算 diff 的前缀和</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="n">sum_d</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="k">if</span> <span class="n">start</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                    <span class="n">start</span> <span class="o">=</span> <span class="n">i</span>  <span class="c1"># 合并后的区间左端点</span>
</span></span><span class="line"><span class="cl">            <span class="k">elif</span> <span class="n">start</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="c1"># i-1 是合并后的区间右端点</span>
</span></span><span class="line"><span class="cl">                <span class="c1"># 由于乘 2 操作，区间左右端点都是偶数，所以 i-1 是偶数，i 是奇数，(i-1)/2 == floor(i/2)</span>
</span></span><span class="line"><span class="cl">                <span class="n">ans</span><span class="o">.</span><span class="n">append</span><span class="p">([</span><span class="n">start</span> <span class="o">//</span> <span class="mi">2</span><span class="p">,</span> <span class="n">i</span> <span class="o">//</span> <span class="mi">2</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">                <span class="n">start</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># 注：最后一轮循环 sum_d == 0，我们不会漏掉最后一个区间</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">ans</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="轮转数组">轮转数组</h3>
<h4 id="题目描述-1">题目描述:</h4>
<p>给定一个整数数组 <code>nums</code>，将数组中的元素向右轮转 <code>k</code> 个位置，其中 <code>k</code> 是非负数。</p>
<p><strong>示例 1:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">输入: nums = [1,2,3,4,5,6,7], k = 3
</span></span><span class="line"><span class="cl">输出: [5,6,7,1,2,3,4]
</span></span><span class="line"><span class="cl">解释:
</span></span><span class="line"><span class="cl">向右轮转 1 步: [7,1,2,3,4,5,6]
</span></span><span class="line"><span class="cl">向右轮转 2 步: [6,7,1,2,3,4,5]
</span></span><span class="line"><span class="cl">向右轮转 3 步: [5,6,7,1,2,3,4]
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>示例 2:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">输入：nums = [-1,-100,3,99], k = 2
</span></span><span class="line"><span class="cl">输出：[3,99,-1,-100]
</span></span><span class="line"><span class="cl">解释: 
</span></span><span class="line"><span class="cl">向右轮转 1 步: [99,-1,-100,3]
</span></span><span class="line"><span class="cl">向右轮转 2 步: [3,99,-1,-100]
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>提示：</strong></p>
<ul>
<li><code>1 &lt;= nums.length &lt;= 105</code></li>
<li><code>-231 &lt;= nums[i] &lt;= 231 - 1</code></li>
<li><code>0 &lt;= k &lt;= 105</code></li>
</ul>
<h4 id="题解自己看很简单">题解：自己看，很简单</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def rotate(self, nums: List[int], k: int) -&gt; None:
</span></span><span class="line"><span class="cl">        &#34;&#34;&#34;
</span></span><span class="line"><span class="cl">        Do not return anything, modify nums in-place instead.
</span></span><span class="line"><span class="cl">        &#34;&#34;&#34;
</span></span><span class="line"><span class="cl">        k=k%len(nums)
</span></span><span class="line"><span class="cl">        p=nums[-k:]
</span></span><span class="line"><span class="cl">        del nums[-k:]
</span></span><span class="line"><span class="cl">        nums[0:0]=p
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="3除了自身以数组的乘积">3.除了自身以数组的乘积</h3>
<h4 id="题目描述-2">题目描述</h4>
<p>给你一个整数数组 <code>nums</code>，返回 数组 <code>answer</code> ，其中 <code>answer[i]</code> 等于 <code>nums</code> 中除了 <code>nums[i]</code> 之外其余各元素的乘积 。</p>
<p>题目数据 <strong>保证</strong> 数组 <code>nums</code>之中任意元素的全部前缀元素和后缀的乘积都在 <strong>32 位</strong> 整数范围内。</p>
<p>请 **不要使用除法，**且在 <code>O(n)</code> 时间复杂度内完成此题。</p>
<p><strong>示例 1:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">输入: nums = [1,2,3,4]
</span></span><span class="line"><span class="cl">输出: [24,12,8,6]
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>示例 2:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">输入: nums = [-1,1,0,-3,3]
</span></span><span class="line"><span class="cl">输出: [0,0,9,0,0]
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="题解">题解：</h4>
<p>计算前乘积和后乘积，两者相乘即可</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">Solution</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="k">def</span> <span class="nf">productExceptSelf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">nums</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="nb">int</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="nb">int</span><span class="p">]:</span>
</span></span><span class="line"><span class="cl">        <span class="n">m</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">nums</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">suf</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">m</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">m</span><span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">            <span class="n">suf</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">suf</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">nums</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="n">per</span> <span class="o">=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">num</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">nums</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">            <span class="n">suf</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">*=</span> <span class="n">per</span>
</span></span><span class="line"><span class="cl">            <span class="n">per</span> <span class="o">*=</span> <span class="n">num</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">suf</span>
</span></span><span class="line"><span class="cl">        <span class="c1">#time O(m)</span>
</span></span><span class="line"><span class="cl">        <span class="c1">#space O(1) </span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="4hard-缺失的第一个正数">4.Hard 缺失的第一个正数</h3>
<h4 id="题目描述-3">题目描述：</h4>
<p>给你一个未排序的整数数组 <code>nums</code> ，请你找出其中没有出现的最小的正整数。</p>
<p>请你实现时间复杂度为 <code>O(n)</code> 并且只使用常数级别额外空间的解决方案。</p>
<p><strong>示例 1：</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">输入：nums = [1,2,0]
</span></span><span class="line"><span class="cl">输出：3
</span></span><span class="line"><span class="cl">解释：范围 [1,2] 中的数字都在数组中。
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>示例 2：</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">输入：nums = [3,4,-1,1]
</span></span><span class="line"><span class="cl">输出：2
</span></span><span class="line"><span class="cl">解释：1 在数组中，但 2 没有。
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>示例 3：</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">输入：nums = [7,8,9,11,12]
</span></span><span class="line"><span class="cl">输出：1
</span></span><span class="line"><span class="cl">解释：最小的正数 1 没有出现。
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="题解-1">题解</h4>
<p>意识到ans &lt;= len(nums)，然后依次判断i是否in nums即可</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">Solution</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="k">def</span> <span class="nf">firstMissingPositive</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">nums</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="nb">int</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">a</span><span class="o">=</span><span class="nb">set</span><span class="p">(</span><span class="n">nums</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="nb">len</span><span class="p">(</span><span class="n">nums</span><span class="p">)</span><span class="o">+</span><span class="mi">2</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="n">i</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">a</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="k">return</span> <span class="n">i</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>还有一个题解我看着很有思路，虽然执行时间更长，但是包含了本地标记的思想，通过hashsize进行本地标记，挺有意思的，我把代码贴上去</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def firstMissingPositive(self, nums: List[int]) -&gt; int:
</span></span><span class="line"><span class="cl">        n = len(nums)
</span></span><span class="line"><span class="cl">        hash_size = n + 1
</span></span><span class="line"><span class="cl">        # 可能的答案为1, 2, ..., n + 1
</span></span><span class="line"><span class="cl">        # 处理掉取值范围外的数
</span></span><span class="line"><span class="cl">        for i in range(n):
</span></span><span class="line"><span class="cl">            if nums[i] &lt;= 0 or nums[i] &gt;= hash_size:
</span></span><span class="line"><span class="cl">                nums[i] = 0
</span></span><span class="line"><span class="cl">        for i in range(n):
</span></span><span class="line"><span class="cl">            if nums[i] % hash_size != 0:
</span></span><span class="line"><span class="cl">                pos = (nums[i] % hash_size) - 1
</span></span><span class="line"><span class="cl">                # 先取余再加，防止数字过大
</span></span><span class="line"><span class="cl">                nums[pos] = (nums[pos] % hash_size) + hash_size
</span></span><span class="line"><span class="cl">        for i in range(n):
</span></span><span class="line"><span class="cl">            if nums[i] &lt; hash_size:
</span></span><span class="line"><span class="cl">                return i + 1
</span></span><span class="line"><span class="cl">        return hash_size
</span></span></code></pre></td></tr></table>
</div>
</div>]]></content:encoded>
    </item>
    <item>
      <title>HOT100 · 矩阵</title>
      <link>https://tuanzi-wow.cn/leetcode%E5%88%B7%E9%A2%98%E8%AE%B0%E5%BD%95/hot100/hot100-matrix/</link>
      <pubDate>Sun, 06 Sep 2026 00:00:00 +0800</pubDate>
      <guid>https://tuanzi-wow.cn/leetcode%E5%88%B7%E9%A2%98%E8%AE%B0%E5%BD%95/hot100/hot100-matrix/</guid>
      <description>HOT100 矩阵专题：矩阵置零、螺旋矩阵、旋转图像与搜索二维矩阵。</description>
      <content:encoded><![CDATA[<h3 id="1矩阵置零">1.矩阵置零</h3>
<h4 id="题目描述">题目描述</h4>
<p>给定一个 <code>*m* x *n*</code> 的矩阵，如果一个元素为 <strong>0</strong> ，则将其所在行和列的所有元素都设为 <strong>0</strong> 。请使用 <strong><a href="http://baike.baidu.com/item/%E5%8E%9F%E5%9C%B0%E7%AE%97%E6%B3%95">原地</a></strong> 算法**。**</p>
<p><strong>示例 1：</strong></p>
<p><img alt="img" loading="lazy" src="https://assets.leetcode.com/uploads/2020/08/17/mat1.jpg"></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">输入：matrix = [[1,1,1],[1,0,1],[1,1,1]]
</span></span><span class="line"><span class="cl">输出：[[1,0,1],[0,0,0],[1,0,1]]
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>示例 2：</strong></p>
<p><img alt="img" loading="lazy" src="https://assets.leetcode.com/uploads/2020/08/17/mat2.jpg"></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">输入：matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
</span></span><span class="line"><span class="cl">输出：[[0,0,0,0],[0,4,5,0],[0,3,1,0]]
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="题解">题解：</h4>
<p>O(MN):</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def setZeroes(self, matrix: List[List[int]]) -&gt; None:
</span></span><span class="line"><span class="cl">        &#34;&#34;&#34;
</span></span><span class="line"><span class="cl">        Do not return anything, modify matrix in-place instead.
</span></span><span class="line"><span class="cl">        &#34;&#34;&#34;
</span></span><span class="line"><span class="cl">        m = len(matrix)
</span></span><span class="line"><span class="cl">        n = len(matrix[0])
</span></span><span class="line"><span class="cl">        ans = []
</span></span><span class="line"><span class="cl">        for x in range(m):
</span></span><span class="line"><span class="cl">            for y in range(n):
</span></span><span class="line"><span class="cl">                if matrix[x][y] == 0:
</span></span><span class="line"><span class="cl">                    ans.append((x,y))
</span></span><span class="line"><span class="cl">        for ele in ans:
</span></span><span class="line"><span class="cl">            for y in range(n):
</span></span><span class="line"><span class="cl">                matrix[ele[0]][y] = 0
</span></span><span class="line"><span class="cl">            for x in range(m):
</span></span><span class="line"><span class="cl">                matrix[x][ele[1]] = 0
</span></span><span class="line"><span class="cl">             
</span></span></code></pre></td></tr></table>
</div>
</div><p>方法二：第一行和列作为标记位：挺简单的，自己看</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def setZeroes(self, matrix: List[List[int]]) -&gt; None:
</span></span><span class="line"><span class="cl">        &#34;&#34;&#34;
</span></span><span class="line"><span class="cl">        Do not return anything, modify matrix in-place instead.
</span></span><span class="line"><span class="cl">        &#34;&#34;&#34;
</span></span><span class="line"><span class="cl">        row = len(matrix)
</span></span><span class="line"><span class="cl">        col = len(matrix[0])
</span></span><span class="line"><span class="cl">        row0_flag = False
</span></span><span class="line"><span class="cl">        col0_flag = False
</span></span><span class="line"><span class="cl">        # 找第一行是否有0
</span></span><span class="line"><span class="cl">        for j in range(col):
</span></span><span class="line"><span class="cl">            if matrix[0][j] == 0:
</span></span><span class="line"><span class="cl">                row0_flag = True
</span></span><span class="line"><span class="cl">                break
</span></span><span class="line"><span class="cl">        # 第一列是否有0
</span></span><span class="line"><span class="cl">        for i in range(row):
</span></span><span class="line"><span class="cl">            if matrix[i][0] == 0:
</span></span><span class="line"><span class="cl">                col0_flag = True
</span></span><span class="line"><span class="cl">                break
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        # 把第一行或者第一列作为 标志位
</span></span><span class="line"><span class="cl">        for i in range(1, row):
</span></span><span class="line"><span class="cl">            for j in range(1, col):
</span></span><span class="line"><span class="cl">                if matrix[i][j] == 0:
</span></span><span class="line"><span class="cl">                    matrix[i][0] = matrix[0][j] = 0
</span></span><span class="line"><span class="cl">        #print(matrix)
</span></span><span class="line"><span class="cl">        # 置0
</span></span><span class="line"><span class="cl">        for i in range(1, row):
</span></span><span class="line"><span class="cl">            for j in range(1, col):
</span></span><span class="line"><span class="cl">                if matrix[i][0] == 0 or matrix[0][j] == 0:
</span></span><span class="line"><span class="cl">                    matrix[i][j] = 0
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        if row0_flag:
</span></span><span class="line"><span class="cl">            for j in range(col):
</span></span><span class="line"><span class="cl">                matrix[0][j] = 0
</span></span><span class="line"><span class="cl">        if col0_flag:
</span></span><span class="line"><span class="cl">            for i in range(row):
</span></span><span class="line"><span class="cl">                matrix[i][0] = 0
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="2螺旋矩阵">2.螺旋矩阵</h3>
<h4 id="题目描述-1">题目描述</h4>
<p>给你一个 <code>m</code> 行 <code>n</code> 列的矩阵 <code>matrix</code> ，请按照 <strong>顺时针螺旋顺序</strong> ，返回矩阵中的所有元素。</p>
<p><strong>示例 1：</strong></p>
<p><img alt="img" loading="lazy" src="https://assets.leetcode.com/uploads/2020/11/13/spiral1.jpg"></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">输入：matrix = [[1,2,3],[4,5,6],[7,8,9]]
</span></span><span class="line"><span class="cl">输出：[1,2,3,6,9,8,7,4,5]
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>示例 2：</strong></p>
<p><img alt="img" loading="lazy" src="https://assets.leetcode.com/uploads/2020/11/13/spiral.jpg"></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">输入：matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
</span></span><span class="line"><span class="cl">输出：[1,2,3,4,8,12,11,10,9,5,6,7]
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>提示：</strong></p>
<ul>
<li><code>m == matrix.length</code></li>
<li><code>n == matrix[i].length</code></li>
<li><code>1 &lt;= m, n &lt;= 10</code></li>
<li><code>-100 &lt;= matrix[i][j] &lt;= 100</code></li>
</ul>
<h4 id="题解-1">题解：</h4>
<p>我说实话，这道题是目前见过最有意思的了
方向数组，取余转向，m,n = n,m-1这几个都挺有意思的</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">DIRS = (0, 1), (1, 0), (0, -1), (-1, 0)  # 右下左上
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def spiralOrder(self, matrix: List[List[int]]) -&gt; List[int]:
</span></span><span class="line"><span class="cl">        m, n = len(matrix), len(matrix[0])
</span></span><span class="line"><span class="cl">        size = m * n
</span></span><span class="line"><span class="cl">        ans = []
</span></span><span class="line"><span class="cl">        i, j, di = 0, -1, 0  # 从 (0, -1) 开始
</span></span><span class="line"><span class="cl">        while len(ans) &lt; size:
</span></span><span class="line"><span class="cl">            dx, dy = DIRS[di]
</span></span><span class="line"><span class="cl">            for _ in range(n):  # 走 n 步（注意 n 会减少）
</span></span><span class="line"><span class="cl">                i += dx
</span></span><span class="line"><span class="cl">                j += dy  # 先走一步
</span></span><span class="line"><span class="cl">                ans.append(matrix[i][j])  # 再加入答案
</span></span><span class="line"><span class="cl">            di = (di + 1) % 4  # 右转 90°
</span></span><span class="line"><span class="cl">            m, n = n, m - 1  # 减少后面的循环次数（步数）
</span></span><span class="line"><span class="cl">        return ans
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="3旋转图像">3.旋转图像</h3>
<p>题目描述：给定一个 <em>n</em> × <em>n</em> 的二维矩阵 <code>matrix</code> 表示一个图像。请你将图像顺时针旋转 90 度。</p>
<p>你必须在**<a href="https://baike.baidu.com/item/%E5%8E%9F%E5%9C%B0%E7%AE%97%E6%B3%95"> 原地</a>** 旋转图像，这意味着你需要直接修改输入的二维矩阵。<strong>请不要</strong> 使用另一个矩阵来旋转图像。</p>
<p><strong>示例 1：</strong></p>
<p><img alt="img" loading="lazy" src="https://assets.leetcode.com/uploads/2020/08/28/mat1.jpg"></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">输入：matrix = [[1,2,3],[4,5,6],[7,8,9]]
</span></span><span class="line"><span class="cl">输出：[[7,4,1],[8,5,2],[9,6,3]]
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>示例 2：</strong></p>
<p><img alt="img" loading="lazy" src="https://assets.leetcode.com/uploads/2020/08/28/mat2.jpg"></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">输入：matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
</span></span><span class="line"><span class="cl">输出：[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="题解-2">题解：</h4>
<p><strong>IM SO FUCKING SMART！！！！</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def rotate(self, matrix: List[List[int]]) -&gt; None:
</span></span><span class="line"><span class="cl">        &#34;&#34;&#34;
</span></span><span class="line"><span class="cl">        Do not return anything, modify matrix in-place instead.
</span></span><span class="line"><span class="cl">        &#34;&#34;&#34;
</span></span><span class="line"><span class="cl">        n  = len(matrix)
</span></span><span class="line"><span class="cl">        ans = [[0] * n for _ in range(n)]
</span></span><span class="line"><span class="cl">        for i in range(n):
</span></span><span class="line"><span class="cl">            for j in range(i+1,n):注意这个i+1啊，只交换一半，不然就交换回去了
</span></span><span class="line"><span class="cl">                matrix[i][j],matrix[j][i] = matrix[j][i],matrix[i][j]
</span></span><span class="line"><span class="cl">        for row in matrix:
</span></span><span class="line"><span class="cl">            row.reverse()
</span></span><span class="line"><span class="cl">       
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="4搜索二维矩阵">4.搜索二维矩阵：</h3>
<h4 id="题目描述-2">题目描述：</h4>
<p>编写一个高效的算法来搜索 <code>*m* x *n*</code> 矩阵 <code>matrix</code> 中的一个目标值 <code>target</code> 。该矩阵具有以下特性：</p>
<ul>
<li>每行的元素从左到右升序排列。</li>
<li>每列的元素从上到下升序排列。</li>
</ul>
<h4 id="题解-3">题解</h4>
<p>直接暴力了啊</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def searchMatrix(self, matrix: List[List[int]], target: int) -&gt; bool:
</span></span><span class="line"><span class="cl">        m = len(matrix)
</span></span><span class="line"><span class="cl">        n = len(matrix[0])
</span></span><span class="line"><span class="cl">        for x in range(m):
</span></span><span class="line"><span class="cl">            for y in range(n):
</span></span><span class="line"><span class="cl">                if matrix[x][y] == target:
</span></span><span class="line"><span class="cl">                    return True
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        return False
</span></span></code></pre></td></tr></table>
</div>
</div><p>或者改进逻辑：从右上角(左下角也可以）开始寻找，小的在左，大的在下，保持单一方向单一逻辑</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">Solution</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="k">def</span> <span class="nf">searchMatrix</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">matrix</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">List</span><span class="p">[</span><span class="nb">int</span><span class="p">]],</span> <span class="n">target</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">m</span><span class="p">,</span><span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">matrix</span><span class="p">),</span><span class="nb">len</span><span class="p">(</span><span class="n">matrix</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">        <span class="n">row</span><span class="p">,</span><span class="n">col</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">while</span> <span class="n">row</span> <span class="o">&lt;</span> <span class="n">m</span> <span class="ow">and</span> <span class="n">col</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="n">matrix</span><span class="p">[</span><span class="n">row</span><span class="p">][</span><span class="n">col</span><span class="p">]</span> <span class="o">==</span> <span class="n">target</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="k">return</span> <span class="kc">True</span>
</span></span><span class="line"><span class="cl">            <span class="k">elif</span> <span class="n">matrix</span><span class="p">[</span><span class="n">row</span><span class="p">][</span><span class="n">col</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">target</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">col</span> <span class="o">-=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">            <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">row</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="kc">False</span>
</span></span><span class="line"><span class="cl">        
</span></span></code></pre></td></tr></table>
</div>
</div>]]></content:encoded>
    </item>
    <item>
      <title>HOT100 · 链表</title>
      <link>https://tuanzi-wow.cn/leetcode%E5%88%B7%E9%A2%98%E8%AE%B0%E5%BD%95/hot100/hot100-linked-list/</link>
      <pubDate>Sun, 06 Sep 2026 00:00:00 +0800</pubDate>
      <guid>https://tuanzi-wow.cn/leetcode%E5%88%B7%E9%A2%98%E8%AE%B0%E5%BD%95/hot100/hot100-linked-list/</guid>
      <description>HOT100 链表专题：相交、反转、回文、环形链表等常见题型与解法。</description>
      <content:encoded><![CDATA[<h3 id="1相交链表">1.相交链表</h3>
<p>题目描述：给你两个单链表的头节点 <code>headA</code> 和 <code>headB</code> ，请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点，返回 <code>null</code> 。</p>
<p>图示两个链表在节点 <code>c1</code> 开始相交**：**</p>
<p><a href="https://assets.leetcode.cn/aliyun-lc-upload/uploads/2018/12/14/160_statement.png"><img src="https://assets.leetcode.cn/aliyun-lc-upload/uploads/2018/12/14/160_statement.png" alt="img" style="zoom:80%;" /></a></p>
<p>题目数据 <strong>保证</strong> 整个链式结构中不存在环。</p>
<p><strong>注意</strong>，函数返回结果后，链表必须 <strong>保持其原始结构</strong> 。</p>
<p><strong>自定义评测：</strong></p>
<p><strong>评测系统</strong> 的输入如下（你设计的程序 <strong>不适用</strong> 此输入）：</p>
<ul>
<li><code>intersectVal</code> - 相交的起始节点的值。如果不存在相交节点，这一值为 <code>0</code></li>
<li><code>listA</code> - 第一个链表</li>
<li><code>listB</code> - 第二个链表</li>
<li><code>skipA</code> - 在 <code>listA</code> 中（从头节点开始）跳到交叉节点的节点数</li>
<li><code>skipB</code> - 在 <code>listB</code> 中（从头节点开始）跳到交叉节点的节点数</li>
</ul>
<p>评测系统将根据这些输入创建链式数据结构，并将两个头节点 <code>headA</code> 和 <code>headB</code> 传递给你的程序。如果程序能够正确返回相交节点，那么你的解决方案将被 <strong>视作正确答案</strong> 。</p>
<p><strong>示例 1：</strong></p>
<p><a href="https://assets.leetcode.com/uploads/2018/12/13/160_example_1.png"><img src="https://assets.leetcode.com/uploads/2021/03/05/160_example_1_1.png" alt="img" style="zoom:67%;" /></a></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">输入：intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3
</span></span><span class="line"><span class="cl">输出：Intersected at &#39;8&#39;
</span></span><span class="line"><span class="cl">解释：相交节点的值为 8 （注意，如果两个链表相交则不能为 0）。
</span></span><span class="line"><span class="cl">从各自的表头开始算起，链表 A 为 [4,1,8,4,5]，链表 B 为 [5,6,1,8,4,5]。
</span></span><span class="line"><span class="cl">在 A 中，相交节点前有 2 个节点；在 B 中，相交节点前有 3 个节点。
</span></span><span class="line"><span class="cl">— 请注意相交节点的值不为 1，因为在链表 A 和链表 B 之中值为 1 的节点 (A 中第二个节点和 B 中第三个节点) 是不同的节点。换句话说，它们在内存中指向两个不同的位置，而链表 A 和链表 B 中值为 8 的节点 (A 中第三个节点，B 中第四个节点) 在内存中指向相同的位置。
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>示例 2：</strong></p>
<p><a href="https://assets.leetcode.com/uploads/2018/12/13/160_example_2.png"><img src="https://assets.leetcode.com/uploads/2021/03/05/160_example_2.png" alt="img" style="zoom:67%;" /></a></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">输入：intersectVal = 2, listA = [1,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
</span></span><span class="line"><span class="cl">输出：Intersected at &#39;2&#39;
</span></span><span class="line"><span class="cl">解释：相交节点的值为 2 （注意，如果两个链表相交则不能为 0）。
</span></span><span class="line"><span class="cl">从各自的表头开始算起，链表 A 为 [1,9,1,2,4]，链表 B 为 [3,2,4]。
</span></span><span class="line"><span class="cl">在 A 中，相交节点前有 3 个节点；在 B 中，相交节点前有 1 个节点。
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>示例 3：</strong></p>
<p><a href="https://assets.leetcode.com/uploads/2018/12/13/160_example_3.png"><img src="https://assets.leetcode.cn/aliyun-lc-upload/uploads/2018/12/14/160_example_3.png" alt="img" style="zoom:67%;" /></a></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">输入：intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
</span></span><span class="line"><span class="cl">输出：No intersection
</span></span><span class="line"><span class="cl">解释：从各自的表头开始算起，链表 A 为 [2,6,4]，链表 B 为 [1,5]。
</span></span><span class="line"><span class="cl">由于这两个链表不相交，所以 intersectVal 必须为 0，而 skipA 和 skipB 可以是任意值。
</span></span><span class="line"><span class="cl">这两个链表不相交，因此返回 null 。
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="题解挺有意思的这样不停循环总有一次会交汇的">题解：挺有意思的，这样不停循环总有一次会交汇的</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">Solution</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">def</span> <span class="nf">getIntersectionNode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">headA</span><span class="p">,</span> <span class="n">headB</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">pa</span> <span class="o">=</span> <span class="n">headA</span>
</span></span><span class="line"><span class="cl">        <span class="n">pb</span> <span class="o">=</span> <span class="n">headB</span>
</span></span><span class="line"><span class="cl">        <span class="k">while</span> <span class="n">pa</span> <span class="o">!=</span> <span class="n">pb</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">pa</span> <span class="o">=</span> <span class="n">pa</span><span class="o">.</span><span class="n">next</span> <span class="k">if</span> <span class="n">pa</span> <span class="k">else</span> <span class="n">headB</span>
</span></span><span class="line"><span class="cl">            <span class="n">pb</span> <span class="o">=</span> <span class="n">pb</span><span class="o">.</span><span class="n">next</span> <span class="k">if</span> <span class="n">pb</span> <span class="k">else</span> <span class="n">headA</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">pa</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="2反转链表">2.反转链表</h3>
<p>给你单链表的头节点 <code>head</code> ，请你反转链表，并返回反转后的链表。</p>
<p><strong>示例 1：</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">输入：head = [1,2,3,4,5]
</span></span><span class="line"><span class="cl">输出：[5,4,3,2,1]
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>示例 2：</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">输入：head = [1,2]
</span></span><span class="line"><span class="cl">输出：[2,1]
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>示例 3：</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">输入：head = []
</span></span><span class="line"><span class="cl">输出：[]
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="题解可以说是经典解法了">题解:可以说是经典解法了</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"># Definition for singly-linked list.
</span></span><span class="line"><span class="cl"># class ListNode:
</span></span><span class="line"><span class="cl">#     def __init__(self, val=0, next=None):
</span></span><span class="line"><span class="cl">#         self.val = val
</span></span><span class="line"><span class="cl">#         self.next = next
</span></span><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def reverseList(self, head: Optional[ListNode]) -&gt; Optional[ListNode]:
</span></span><span class="line"><span class="cl">        pre=None
</span></span><span class="line"><span class="cl">        cur = head
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        while cur:
</span></span><span class="line"><span class="cl">            next_node = cur.next
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            cur.next = pre
</span></span><span class="line"><span class="cl">            pre = cur
</span></span><span class="line"><span class="cl">            cur = next_node
</span></span><span class="line"><span class="cl">        return pre
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="3回文链表">3.回文链表</h3>
<h4 id="题目描述">题目描述</h4>
<p>给你一个单链表的头节点 <code>head</code> ，请你判断该链表是否为回文链表。如果是，返回 <code>true</code> ；否则，返回 <code>false</code></p>
<p>题解：方法都是转化成value判断，看谁写的效率高罢了</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"># Definition for singly-linked list.
</span></span><span class="line"><span class="cl"># class ListNode:
</span></span><span class="line"><span class="cl">#     def __init__(self, val=0, next=None):
</span></span><span class="line"><span class="cl">#         self.val = val
</span></span><span class="line"><span class="cl">#         self.next = next
</span></span><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def isPalindrome(self, head: Optional[ListNode]) -&gt; bool:
</span></span><span class="line"><span class="cl">        values = []
</span></span><span class="line"><span class="cl">        cur = head
</span></span><span class="line"><span class="cl">        cnt = 0
</span></span><span class="line"><span class="cl">        while cur:
</span></span><span class="line"><span class="cl">            values.append(cur.val)
</span></span><span class="line"><span class="cl">            cur = cur.next
</span></span><span class="line"><span class="cl">            cnt += 1
</span></span><span class="line"><span class="cl">        for i in range((int)(cnt/2)):
</span></span><span class="line"><span class="cl">            if values[i] != values[cnt-i-1]:
</span></span><span class="line"><span class="cl">                return False
</span></span><span class="line"><span class="cl">        return True
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="4环形链表">4.环形链表</h3>
<h4 id="题目描述-1">题目描述</h4>
<p>给你一个链表的头节点 <code>head</code> ，判断链表中是否有环。</p>
<p>如果链表中有某个节点，可以通过连续跟踪 <code>next</code> 指针再次到达，则链表中存在环。 为了表示给定链表中的环，评测系统内部使用整数 <code>pos</code> 来表示链表尾连接到链表中的位置（索引从 0 开始）。<strong>注意：<code>pos</code> 不作为参数进行传递</strong> 。仅仅是为了标识链表的实际情况。</p>
<p><em>如果链表中存在环</em> ，则返回 <code>true</code> 。 否则，返回 <code>false</code> 。</p>
<h4 id="题解">题解</h4>
<p>1.快慢指针法：顾名思义，我懒得解释</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"># Definition for singly-linked list.
</span></span><span class="line"><span class="cl"># class ListNode:
</span></span><span class="line"><span class="cl">#     def __init__(self, x):
</span></span><span class="line"><span class="cl">#         self.val = x
</span></span><span class="line"><span class="cl">#         self.next = None
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def hasCycle(self, head: Optional[ListNode]) -&gt; bool:
</span></span><span class="line"><span class="cl">        slow = head
</span></span><span class="line"><span class="cl">        fast = head
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        while fast and fast.next:
</span></span><span class="line"><span class="cl">            slow = slow.next
</span></span><span class="line"><span class="cl">            fast = fast.next.next
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            if slow == fast:
</span></span><span class="line"><span class="cl">                return True
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        return False
</span></span></code></pre></td></tr></table>
</div>
</div><p>2.嗨嗨嗨，我用集合想不到吧set来了</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"># Definition for singly-linked list.
</span></span><span class="line"><span class="cl"># class ListNode:
</span></span><span class="line"><span class="cl">#     def __init__(self, x):
</span></span><span class="line"><span class="cl">#         self.val = x
</span></span><span class="line"><span class="cl">#         self.next = None
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def hasCycle(self, head: Optional[ListNode]) -&gt; bool:
</span></span><span class="line"><span class="cl">        cur = head
</span></span><span class="line"><span class="cl">        visit =set()
</span></span><span class="line"><span class="cl">        while cur:
</span></span><span class="line"><span class="cl">            if cur in visit:
</span></span><span class="line"><span class="cl">                return True
</span></span><span class="line"><span class="cl">            visit.add(cur)
</span></span><span class="line"><span class="cl">            cur = cur.next
</span></span><span class="line"><span class="cl">        return False
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="5环形链表2">5.环形链表2</h3>
<h4 id="题目描述-2">题目描述</h4>
<p>给定一个链表的头节点  <code>head</code> ，返回链表开始入环的第一个节点。 <em>如果链表无环，则返回 <code>null</code>。</em></p>
<p>如果链表中有某个节点，可以通过连续跟踪 <code>next</code> 指针再次到达，则链表中存在环。 为了表示给定链表中的环，评测系统内部使用整数 <code>pos</code> 来表示链表尾连接到链表中的位置（<strong>索引从 0 开始</strong>）。如果 <code>pos</code> 是 <code>-1</code>，则在该链表中没有环。<strong>注意：<code>pos</code> 不作为参数进行传递</strong>，仅仅是为了标识链表的实际情况。</p>
<p><strong>不允许修改</strong> 链表。</p>
<h4 id="题解还是上面两种">题解：还是上面两种</h4>
<p>set</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def detectCycle(self, head):
</span></span><span class="line"><span class="cl">        visited = set()
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        while head:
</span></span><span class="line"><span class="cl">            if head in visited:
</span></span><span class="line"><span class="cl">                return head
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            visited.add(head)
</span></span><span class="line"><span class="cl">            head = head.next
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        return None
</span></span></code></pre></td></tr></table>
</div>
</div><p>快慢指针：懒得找了，比较经典吧</p>
<h3 id="6合并两个有序列表">6.合并两个有序列表</h3>
<h4 id="题目描述-3">题目描述</h4>
<p>将两个升序链表合并为一个新的 <strong>升序</strong> 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的</p>
<p>题解：虚拟头节点：挺有思想的，值得学习；我当时忘记处理剩下的剩余链表了</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def mergeTwoLists(
</span></span><span class="line"><span class="cl">        self,
</span></span><span class="line"><span class="cl">        list1: Optional[ListNode],
</span></span><span class="line"><span class="cl">        list2: Optional[ListNode]
</span></span><span class="line"><span class="cl">    ) -&gt; Optional[ListNode]:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        dummy = ListNode()
</span></span><span class="line"><span class="cl">        cur = dummy
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        while list1 and list2:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            if list1.val &lt;= list2.val:
</span></span><span class="line"><span class="cl">                cur.next = list1
</span></span><span class="line"><span class="cl">                list1 = list1.next
</span></span><span class="line"><span class="cl">            else:
</span></span><span class="line"><span class="cl">                cur.next = list2
</span></span><span class="line"><span class="cl">                list2 = list2.next
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            cur = cur.next
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        if list1:
</span></span><span class="line"><span class="cl">            cur.next = list1
</span></span><span class="line"><span class="cl">        else:
</span></span><span class="line"><span class="cl">            cur.next = list2
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        return dummy.next
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="7again-两数相加">7.again 两数相加</h3>
<h4 id="题目描述-4">题目描述：</h4>
<p>给你两个 <strong>非空</strong> 的链表，表示两个非负的整数。它们每位数字都是按照 <strong>逆序</strong> 的方式存储的，并且每个节点只能存储 <strong>一位</strong> 数字。</p>
<p>请你将两个数相加，并以相同形式返回一个表示和的链表。</p>
<p>你可以假设除了数字 0 之外，这两个数都不会以 0 开头。</p>
<h4 id="题解-1">题解：</h4>
<p>模拟竖式加法，逐位计算两个链表节点的值，加上进位，然后用尾插法把每一位结果连接成新的链表。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"># Definition for singly-linked list.
</span></span><span class="line"><span class="cl"># class ListNode:
</span></span><span class="line"><span class="cl">#     def __init__(self, val=0, next=None):
</span></span><span class="line"><span class="cl">#         self.val = val
</span></span><span class="line"><span class="cl">#         self.next = next
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -&gt; Optional[ListNode]:
</span></span><span class="line"><span class="cl">        dummy = ListNode()
</span></span><span class="line"><span class="cl">        cur = dummy
</span></span><span class="line"><span class="cl">        carry = 0
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        while l1 or l2 or carry:
</span></span><span class="line"><span class="cl">            val1 = l1.val if l1 else 0
</span></span><span class="line"><span class="cl">            val2 = l2.val if l2 else 0
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            total = val1 + val2 + carry
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            carry = total // 10
</span></span><span class="line"><span class="cl">            digit = total % 10
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            cur.next = ListNode(digit)
</span></span><span class="line"><span class="cl">            cur = cur.next
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            if l1:
</span></span><span class="line"><span class="cl">                l1 = l1.next
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            if l2:
</span></span><span class="line"><span class="cl">                l2 = l2.next
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        return dummy.next
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="8删除链表倒数第n个节点">8.删除链表倒数第n个节点</h3>
<h4 id="题目描述-5">题目描述：</h4>
<p>给你一个链表，删除链表的倒数第 <code>n</code> 个结点，并且返回链表的头结点。</p>
<h4 id="题解-2">题解：</h4>
<p>依旧快慢指针这一块</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"># Definition for singly-linked list.
</span></span><span class="line"><span class="cl"># class ListNode:
</span></span><span class="line"><span class="cl">#     def __init__(self, val=0, next=None):
</span></span><span class="line"><span class="cl">#         self.val = val
</span></span><span class="line"><span class="cl">#         self.next = next
</span></span><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def removeNthFromEnd(self, head: Optional[ListNode], n: int) -&gt; Optional[ListNode]:
</span></span><span class="line"><span class="cl">        dummy  = ListNode(0,head)
</span></span><span class="line"><span class="cl">        slow,fast = dummy,dummy
</span></span><span class="line"><span class="cl">        for i in range(n):
</span></span><span class="line"><span class="cl">            fast = fast.next
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        while fast.next:
</span></span><span class="line"><span class="cl">            fast = fast.next
</span></span><span class="line"><span class="cl">            slow = slow.next
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        slow.next = slow.next.next
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        return dummy.next
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="9两两交换链表中的结点">9.两两交换链表中的结点</h3>
<h4 id="题目描述-6">题目描述：</h4>
<p>给你一个链表，两两交换其中相邻的节点，并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题（即，只能进行节点交换）。</p>
<h4 id="题解-3">题解：</h4>
<p>使用虚拟头节点 <code>dummy</code> 和一个前驱指针 <code>pre</code>，每次找到相邻的两个节点进行交换，然后把 <code>pre</code> 移动到交换后的第一个节点（原来的第一个节点），继续处理下一对</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def swapPairs(self, head: Optional[ListNode]) -&gt; Optional[ListNode]:
</span></span><span class="line"><span class="cl">        dummy = ListNode(0, head)
</span></span><span class="line"><span class="cl">        pre = dummy
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        while pre.next and pre.next.next:
</span></span><span class="line"><span class="cl">            first = pre.next
</span></span><span class="line"><span class="cl">            second = first.next
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            # 交换两个节点
</span></span><span class="line"><span class="cl">            first.next = second.next
</span></span><span class="line"><span class="cl">            second.next = first
</span></span><span class="line"><span class="cl">            pre.next = second
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            # 移动到下一组
</span></span><span class="line"><span class="cl">            pre = first
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        return dummy.next
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="10k个一组翻转链表">10.K个一组翻转链表</h3>
<h4 id="题目描述-7">题目描述：</h4>
<p>给你链表的头节点 <code>head</code> ，每 <code>k</code> 个节点一组进行翻转，请你返回修改后的链表。</p>
<p><code>k</code> 是一个正整数，它的值小于或等于链表的长度。如果节点总数不是 <code>k</code> 的整数倍，那么请将最后剩余的节点保持原有顺序。</p>
<p>你不能只是单纯的改变节点内部的值，而是需要实际进行节点交换。</p>
<h4 id="题解-4">题解：</h4>
<p>啊，真是一场酣畅淋漓的战斗啊</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def reverseKGroup(self, head: Optional[ListNode], k: int) -&gt; Optional[ListNode]:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        dummy = ListNode()
</span></span><span class="line"><span class="cl">        dummy.next = head
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        groupprv = dummy
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        while True:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            kth = groupprv
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            # 找第 k 个节点
</span></span><span class="line"><span class="cl">            for _ in range(k):
</span></span><span class="line"><span class="cl">                kth = kth.next
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                if not kth:
</span></span><span class="line"><span class="cl">                    return dummy.next
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            groupnext = kth.next
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            # 翻转当前组
</span></span><span class="line"><span class="cl">            cur = groupprv.next
</span></span><span class="line"><span class="cl">            tail = groupnext
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            while cur != groupnext:
</span></span><span class="line"><span class="cl">                nxt = cur.next
</span></span><span class="line"><span class="cl">                cur.next = tail
</span></span><span class="line"><span class="cl">                tail = cur
</span></span><span class="line"><span class="cl">                cur = nxt
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            # 更新连接关系
</span></span><span class="line"><span class="cl">            tmp = groupprv.next
</span></span><span class="line"><span class="cl">            groupprv.next = kth
</span></span><span class="line"><span class="cl">            groupprv = tmp
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="11排序列表">11.排序列表</h3>
<h4 id="题目描述-8">题目描述：</h4>
<p>给你链表的头结点 <code>head</code> ，请将其按 <strong>升序</strong> 排列并返回 <strong>排序后的链表</strong> 。</p>
<h4 id="题解-5">题解</h4>
<p>1.我要暴力了啊：冒泡排序
class Solution:
def sortList(self, head: Optional[ListNode]) -&gt; Optional[ListNode]:
if not head or not head.next:
return head</p>
<pre><code>class Solution:
    def sortList(self, head: Optional[ListNode]) -&gt; Optional[ListNode]:
        if not head or not head.next:
            return head

        # 计算链表长度
        cnt = 0
        cur = head
        while cur:
            cnt += 1
            cur = cur.next

        # 冒泡排序
        for i in range(cnt - 1):
            cur = head

            for j in range(cnt - 1 - i):
                if cur.val &gt; cur.next.val:
                    cur.val, cur.next.val = cur.next.val, cur.val

                cur = cur.next

        return head
</code></pre>
<p>2.归并排序
不断把链表从中间拆成两半，直到每个链表只剩一个节点；然后再将两个有序链表不断合并，最终得到完整的有序链表。
递归；归并排序
思路很重要，代码挺简单的，自己看</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span><span class="lnt">54
</span><span class="lnt">55
</span><span class="lnt">56
</span><span class="lnt">57
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def sortList(self, head: Optional[ListNode]) -&gt; Optional[ListNode]:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        # 只有 0 个或 1 个节点，不需要排序
</span></span><span class="line"><span class="cl">        if not head or not head.next:
</span></span><span class="line"><span class="cl">            return head
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        # ====================
</span></span><span class="line"><span class="cl">        # 1. 快慢指针找中点
</span></span><span class="line"><span class="cl">        # ====================
</span></span><span class="line"><span class="cl">        slow = head
</span></span><span class="line"><span class="cl">        fast = head.next
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        while fast and fast.next:
</span></span><span class="line"><span class="cl">            slow = slow.next
</span></span><span class="line"><span class="cl">            fast = fast.next.next
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        # ====================
</span></span><span class="line"><span class="cl">        # 2. 从中间断开
</span></span><span class="line"><span class="cl">        # ====================
</span></span><span class="line"><span class="cl">        mid = slow.next
</span></span><span class="line"><span class="cl">        slow.next = None
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        # ====================
</span></span><span class="line"><span class="cl">        # 3. 分别排序左右两部分
</span></span><span class="line"><span class="cl">        # ====================
</span></span><span class="line"><span class="cl">        left = self.sortList(head)
</span></span><span class="line"><span class="cl">        right = self.sortList(mid)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        # ====================
</span></span><span class="line"><span class="cl">        # 4. 合并两个有序链表
</span></span><span class="line"><span class="cl">        # ====================
</span></span><span class="line"><span class="cl">        return self.merge(left, right)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    def merge(self, l1, l2):
</span></span><span class="line"><span class="cl">        dummy = ListNode()
</span></span><span class="line"><span class="cl">        cur = dummy
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        while l1 and l2:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            if l1.val &lt; l2.val:
</span></span><span class="line"><span class="cl">                cur.next = l1
</span></span><span class="line"><span class="cl">                l1 = l1.next
</span></span><span class="line"><span class="cl">            else:
</span></span><span class="line"><span class="cl">                cur.next = l2
</span></span><span class="line"><span class="cl">                l2 = l2.next
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            cur = cur.next
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        # 剩下的直接接上
</span></span><span class="line"><span class="cl">        if l1:
</span></span><span class="line"><span class="cl">            cur.next = l1
</span></span><span class="line"><span class="cl">        else:
</span></span><span class="line"><span class="cl">            cur.next = l2
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        return dummy.next
</span></span></code></pre></td></tr></table>
</div>
</div><p>3.一个为了解题的简单方法，挺没意思的</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def sortList(self, head: Optional[ListNode]) -&gt; Optional[ListNode]:
</span></span><span class="line"><span class="cl">        if not head or not head.next:
</span></span><span class="line"><span class="cl">           return head
</span></span><span class="line"><span class="cl">        seen = []
</span></span><span class="line"><span class="cl">        cur = head
</span></span><span class="line"><span class="cl">        while cur:
</span></span><span class="line"><span class="cl">            seen.append(cur.val)
</span></span><span class="line"><span class="cl">            cur = cur.next
</span></span><span class="line"><span class="cl">        seen.sort()
</span></span><span class="line"><span class="cl">        cur = head
</span></span><span class="line"><span class="cl">        for i in seen:
</span></span><span class="line"><span class="cl">            cur.val = i
</span></span><span class="line"><span class="cl">            cur = cur.next
</span></span><span class="line"><span class="cl">        return head
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="12合并k个升序列表">12.合并k个升序列表</h3>
<h4 id="题目描述-9">题目描述：</h4>
<p>给你一个链表数组，每个链表都已经按升序排列。</p>
<p>请你将所有链表合并到一个升序链表中，返回合并后的链表。</p>
<h4 id="题解-6">题解：</h4>
<p>不道德的解法1：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"># Definition for singly-linked list.
</span></span><span class="line"><span class="cl"># class ListNode:
</span></span><span class="line"><span class="cl">#     def __init__(self, val=0, next=None):
</span></span><span class="line"><span class="cl">#         self.val = val
</span></span><span class="line"><span class="cl">#         self.next = next
</span></span><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def mergeKLists(self, lists: List[Optional[ListNode]]) -&gt; Optional[ListNode]:
</span></span><span class="line"><span class="cl">        values=[]
</span></span><span class="line"><span class="cl">        for head in lists:
</span></span><span class="line"><span class="cl">            while head:
</span></span><span class="line"><span class="cl">                values.append(head.val)
</span></span><span class="line"><span class="cl">                head=head.next
</span></span><span class="line"><span class="cl">        values.sort()
</span></span><span class="line"><span class="cl">        ptr = ListNode()
</span></span><span class="line"><span class="cl">        dummy = ListNode()
</span></span><span class="line"><span class="cl">        dummy.next = ptr
</span></span><span class="line"><span class="cl">        for x in range(len(values)):
</span></span><span class="line"><span class="cl">            cur = ListNode(values[x])
</span></span><span class="line"><span class="cl">            ptr.next = cur
</span></span><span class="line"><span class="cl">            ptr=cur
</span></span><span class="line"><span class="cl">        return dummy.next.next
</span></span><span class="line"><span class="cl">                
</span></span><span class="line"><span class="cl">        
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="13lru缓存">13.LRU缓存</h3>
<h4 id="题目描述-10">题目描述：</h4>
<p>请你设计并实现一个满足 <a href="https://baike.baidu.com/item/LRU">LRU (最近最少使用) 缓存</a> 约束的数据结构。</p>
<p>实现 <code>LRUCache</code> 类：</p>
<ul>
<li><code>LRUCache(int capacity)</code> 以 <strong>正整数</strong> 作为容量 <code>capacity</code> 初始化 LRU 缓存</li>
<li><code>int get(int key)</code> 如果关键字 <code>key</code> 存在于缓存中，则返回关键字的值，否则返回 <code>-1</code> 。</li>
<li><code>void put(int key, int value)</code> 如果关键字 <code>key</code> 已经存在，则变更其数据值 <code>value</code> ；如果不存在，则向缓存中插入该组 <code>key-value</code> 。如果插入操作导致关键字数量超过 <code>capacity</code> ，则应该 <strong>逐出</strong> 最久未使用的关键字。</li>
</ul>
<p>函数 <code>get</code> 和 <code>put</code> 必须以 <code>O(1)</code> 的平均时间复杂度运行。</p>
<h4 id="解法哈希表加双向链表或者你熟悉linkedhashmap也好做">解法：哈希表加双向链表或者你熟悉LinkedHashmap也好做</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span><span class="lnt">54
</span><span class="lnt">55
</span><span class="lnt">56
</span><span class="lnt">57
</span><span class="lnt">58
</span><span class="lnt">59
</span><span class="lnt">60
</span><span class="lnt">61
</span><span class="lnt">62
</span><span class="lnt">63
</span><span class="lnt">64
</span><span class="lnt">65
</span><span class="lnt">66
</span><span class="lnt">67
</span><span class="lnt">68
</span><span class="lnt">69
</span><span class="lnt">70
</span><span class="lnt">71
</span><span class="lnt">72
</span><span class="lnt">73
</span><span class="lnt">74
</span><span class="lnt">75
</span><span class="lnt">76
</span><span class="lnt">77
</span><span class="lnt">78
</span><span class="lnt">79
</span><span class="lnt">80
</span><span class="lnt">81
</span><span class="lnt">82
</span><span class="lnt">83
</span><span class="lnt">84
</span><span class="lnt">85
</span><span class="lnt">86
</span><span class="lnt">87
</span><span class="lnt">88
</span><span class="lnt">89
</span><span class="lnt">90
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">class Node:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    def __init__(self, key=0, value=0):
</span></span><span class="line"><span class="cl">        self.key = key
</span></span><span class="line"><span class="cl">        self.value = value
</span></span><span class="line"><span class="cl">        self.prev = None
</span></span><span class="line"><span class="cl">        self.next = None
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">class LRUCache:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    def __init__(self, capacity: int):
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        self.capacity = capacity
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        # 哈希表
</span></span><span class="line"><span class="cl">        self.cache = {}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        # 双向链表虚拟头尾
</span></span><span class="line"><span class="cl">        self.head = Node()
</span></span><span class="line"><span class="cl">        self.tail = Node()
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        self.head.next = self.tail
</span></span><span class="line"><span class="cl">        self.tail.prev = self.head
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    def get(self, key: int) -&gt; int:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        if key not in self.cache:
</span></span><span class="line"><span class="cl">            return -1
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        node = self.cache[key]
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        # 最近使用，移动到头部
</span></span><span class="line"><span class="cl">        self._remove(node)
</span></span><span class="line"><span class="cl">        self._add_to_head(node)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        return node.value
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    def put(self, key: int, value: int) -&gt; None:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        # key 已经存在
</span></span><span class="line"><span class="cl">        if key in self.cache:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            node = self.cache[key]
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            node.value = value
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            # 更新后也是最近使用
</span></span><span class="line"><span class="cl">            self._remove(node)
</span></span><span class="line"><span class="cl">            self._add_to_head(node)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        else:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            # 创建新节点
</span></span><span class="line"><span class="cl">            node = Node(key, value)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            self.cache[key] = node
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            # 放到头部
</span></span><span class="line"><span class="cl">            self._add_to_head(node)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            # 超过容量
</span></span><span class="line"><span class="cl">            if len(self.cache) &gt; self.capacity:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                # 删除尾部节点
</span></span><span class="line"><span class="cl">                last = self.tail.prev
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                self._remove(last)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                del self.cache[last.key]
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    def _remove(self, node):
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        prev_node = node.prev
</span></span><span class="line"><span class="cl">        next_node = node.next
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        prev_node.next = next_node
</span></span><span class="line"><span class="cl">        next_node.prev = prev_node
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    def _add_to_head(self, node):
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        node.prev = self.head
</span></span><span class="line"><span class="cl">        node.next = self.head.next
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        self.head.next.prev = node
</span></span><span class="line"><span class="cl">        self.head.next = node
</span></span></code></pre></td></tr></table>
</div>
</div>]]></content:encoded>
    </item>
    <item>
      <title>HOT100 · 二叉树</title>
      <link>https://tuanzi-wow.cn/leetcode%E5%88%B7%E9%A2%98%E8%AE%B0%E5%BD%95/hot100/hot100-binary-tree/</link>
      <pubDate>Sun, 06 Sep 2026 00:00:00 +0800</pubDate>
      <guid>https://tuanzi-wow.cn/leetcode%E5%88%B7%E9%A2%98%E8%AE%B0%E5%BD%95/hot100/hot100-binary-tree/</guid>
      <description>HOT100 二叉树专题：遍历、深度、翻转、最近公共祖先等常见题型与解法。</description>
      <content:encoded><![CDATA[<h3 id="1二叉树的中序遍历">1.二叉树的中序遍历：</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"># Definition for a binary tree node.
</span></span><span class="line"><span class="cl"># class TreeNode:
</span></span><span class="line"><span class="cl">#     def __init__(self, val=0, left=None, right=None):
</span></span><span class="line"><span class="cl">#         self.val = val
</span></span><span class="line"><span class="cl">#         self.left = left
</span></span><span class="line"><span class="cl">#         self.right = right
</span></span><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    global ans = []
</span></span><span class="line"><span class="cl">    def inorderTraversal(self, root: Optional[TreeNode]) -&gt; List[int]:
</span></span><span class="line"><span class="cl">            if not root:
</span></span><span class="line"><span class="cl">                return []
</span></span><span class="line"><span class="cl">            
</span></span><span class="line"><span class="cl">            self.inorderTraversal(root.left)
</span></span><span class="line"><span class="cl">            ans.append(root.val)
</span></span><span class="line"><span class="cl">            self.inorderTraversal(root.right)
</span></span><span class="line"><span class="cl">            return ans
</span></span><span class="line"><span class="cl">        
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="2二叉树的最大深度">2.二叉树的最大深度：</h3>
<p>递递的归</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"># Definition for a binary tree node.
</span></span><span class="line"><span class="cl"># class TreeNode:
</span></span><span class="line"><span class="cl">#     def __init__(self, val=0, left=None, right=None):
</span></span><span class="line"><span class="cl">#         self.val = val
</span></span><span class="line"><span class="cl">#         self.left = left
</span></span><span class="line"><span class="cl">#         self.right = right
</span></span><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def maxDepth(self, root: Optional[TreeNode]) -&gt; int:
</span></span><span class="line"><span class="cl">        if root == None:
</span></span><span class="line"><span class="cl">            return 0
</span></span><span class="line"><span class="cl">        l= self.maxDepth(root.left)
</span></span><span class="line"><span class="cl">        r = self.maxDepth(root.right)
</span></span><span class="line"><span class="cl">        return max(l,r)+1
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="3翻转二叉树">3.翻转二叉树：</h3>
<p>依旧递递的归：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"># Definition for a binary tree node.
</span></span><span class="line"><span class="cl"># class TreeNode:
</span></span><span class="line"><span class="cl">#     def __init__(self, val=0, left=None, right=None):
</span></span><span class="line"><span class="cl">#         self.val = val
</span></span><span class="line"><span class="cl">#         self.left = left
</span></span><span class="line"><span class="cl">#         self.right = right
</span></span><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def invertTree(self, root: Optional[TreeNode]) -&gt; Optional[TreeNode]:
</span></span><span class="line"><span class="cl">            def invert(node):
</span></span><span class="line"><span class="cl">                if not node:
</span></span><span class="line"><span class="cl">                    return
</span></span><span class="line"><span class="cl">                node.left,node.right = node.right,node.left
</span></span><span class="line"><span class="cl">                invert(node.left)
</span></span><span class="line"><span class="cl">                invert(node.right)
</span></span><span class="line"><span class="cl">            invert(root)
</span></span><span class="line"><span class="cl">            return root
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="4对称二叉树">4.对称二叉树</h3>
<p>依旧递递的归</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"># Definition for a binary tree node.
</span></span><span class="line"><span class="cl"># class TreeNode:
</span></span><span class="line"><span class="cl">#     def __init__(self, val=0, left=None, right=None):
</span></span><span class="line"><span class="cl">#         self.val = val
</span></span><span class="line"><span class="cl">#         self.left = left
</span></span><span class="line"><span class="cl">#         self.right = right
</span></span><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def isSymmetric(self, root: Optional[TreeNode]) -&gt; bool:
</span></span><span class="line"><span class="cl">      
</span></span><span class="line"><span class="cl">        def isduichen(lnode,rnode)-&gt;bool:
</span></span><span class="line"><span class="cl">            if not lnode and not rnode:
</span></span><span class="line"><span class="cl">                return True
</span></span><span class="line"><span class="cl">            if not (lnode and rnode):
</span></span><span class="line"><span class="cl">                return False
</span></span><span class="line"><span class="cl">            if lnode.val != rnode.val or lnode.val != rnode.val:
</span></span><span class="line"><span class="cl">                return False
</span></span><span class="line"><span class="cl">            return isduichen(lnode.left,rnode.right) and isduichen(lnode.right,rnode.left)
</span></span><span class="line"><span class="cl">        if not root:
</span></span><span class="line"><span class="cl">            return True
</span></span><span class="line"><span class="cl">        return isduichen(root.left,root.right)
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="5树的直径">5.树的直径</h3>
<p>算各个结点的左右深度之和并维持一个最大值</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"># Definition for a binary tree node.
</span></span><span class="line"><span class="cl"># class TreeNode:
</span></span><span class="line"><span class="cl">#     def __init__(self, val=0, left=None, right=None):
</span></span><span class="line"><span class="cl">#         self.val = val
</span></span><span class="line"><span class="cl">#         self.left = left
</span></span><span class="line"><span class="cl">#         self.right = right
</span></span><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def diameterOfBinaryTree(self, root: TreeNode) -&gt; int:
</span></span><span class="line"><span class="cl">        self.ans = 1
</span></span><span class="line"><span class="cl">        def depth(root):
</span></span><span class="line"><span class="cl">            if not root: return 0
</span></span><span class="line"><span class="cl">            L = depth(root.left)
</span></span><span class="line"><span class="cl">            R = depth(root.right)
</span></span><span class="line"><span class="cl">            self.ans = max(self.ans, L + R + 1)
</span></span><span class="line"><span class="cl">            return max(L, R) + 1
</span></span><span class="line"><span class="cl">        depth(root)
</span></span><span class="line"><span class="cl">        return self.ans - 1
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="6二叉树的层序遍历">6.二叉树的层序遍历</h3>
<h4 id="题目描述">题目描述：</h4>
<p>给你二叉树的根节点 <code>root</code> ，返回其节点值的 <strong>层序遍历</strong></p>
<h4 id="题解">题解：</h4>
<p>使用队列辅助</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">from collections import deque
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def levelOrder(self, root: Optional[TreeNode]) -&gt; List[List[int]]:
</span></span><span class="line"><span class="cl">        if not root:
</span></span><span class="line"><span class="cl">            return []
</span></span><span class="line"><span class="cl">        ans = []
</span></span><span class="line"><span class="cl">        queue = deque([root])
</span></span><span class="line"><span class="cl">        while queue:
</span></span><span class="line"><span class="cl">            level = []
</span></span><span class="line"><span class="cl">            # 当前层有多少个节点
</span></span><span class="line"><span class="cl">            size = len(queue)
</span></span><span class="line"><span class="cl">            # 只处理当前层的节点
</span></span><span class="line"><span class="cl">            for _ in range(size):
</span></span><span class="line"><span class="cl">                node = queue.popleft()
</span></span><span class="line"><span class="cl">                level.append(node.val)
</span></span><span class="line"><span class="cl">                if node.left:
</span></span><span class="line"><span class="cl">                    queue.append(node.left)
</span></span><span class="line"><span class="cl">                if node.right:
</span></span><span class="line"><span class="cl">                    queue.append(node.right)
</span></span><span class="line"><span class="cl">            ans.append(level)
</span></span><span class="line"><span class="cl">        return ans
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="7将有序数组转换为二叉搜索树">7.将有序数组转换为二叉搜索树</h3>
<h4 id="题目描述-1">题目描述：</h4>
<p>给你一个整数数组 <code>nums</code> ，其中元素已经按 <strong>升序</strong> 排列，请你将其转换为一棵 平衡 二叉搜索树</p>
<h4 id="题解-1">题解：</h4>
<p>还是递归,我没招了</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def sortedArrayToBST(self, nums: List[int]) -&gt; Optional[TreeNode]:
</span></span><span class="line"><span class="cl">        def build(left, right):
</span></span><span class="line"><span class="cl">            if left &gt; right:
</span></span><span class="line"><span class="cl">                return None
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            mid = (left + right) // 2
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            root = TreeNode(nums[mid])
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            root.left = build(left, mid - 1)
</span></span><span class="line"><span class="cl">            root.right = build(mid + 1, right)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            return root
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        return build(0, len(nums) - 1)
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="8验证二叉搜索树">8.验证二叉搜索树:</h3>
<h4 id="题目描述-2">题目描述:</h4>
<p>给你一个二叉树的根节点 <code>root</code> ，判断其是否是一个有效的二叉搜索树。</p>
<p><strong>有效</strong> 二叉搜索树定义如下：</p>
<ul>
<li>节点的左子树只包含 <strong>严格小于</strong> 当前节点的数。</li>
<li>节点的右子树只包含 <strong>严格大于</strong> 当前节点的数。</li>
<li>所有左子树和右子树自身必须也是二叉搜索树。</li>
</ul>
<h4 id="题解-2">题解:</h4>
<p>依旧递递的归
要注意的是:不能只比较父节点和直接子节点,要为每个节点设置一个范围(我第一遍就错在这了)</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"># Definition for a binary tree node.
</span></span><span class="line"><span class="cl"># class TreeNode:
</span></span><span class="line"><span class="cl">#     def __init__(self, val=0, left=None, right=None):
</span></span><span class="line"><span class="cl">#         self.val = val
</span></span><span class="line"><span class="cl">#         self.left = left
</span></span><span class="line"><span class="cl">#         self.right = right
</span></span><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def isValidBST(self, root: Optional[TreeNode],left = -inf,right = inf) -&gt; bool:
</span></span><span class="line"><span class="cl">        if not root:
</span></span><span class="line"><span class="cl">            return True
</span></span><span class="line"><span class="cl">        return left &lt; root.val &lt; right and self.isValidBST(root.left,left,root.val) and self.isValidBST(root.right,root.val,right)
</span></span><span class="line"><span class="cl">        
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="9二叉搜索树中第k小的元素">9.二叉搜索树中第K小的元素:</h3>
<h4 id="题目描述-3">题目描述:</h4>
<p>给定一个二叉搜索树的根节点 <code>root</code> ，和一个整数 <code>k</code> ，请你设计一个算法查找其中第 <code>k</code> 小的元素（<code>k</code> 从 1 开始计数）。</p>
<p>题解:
我的第一想法:遍历并排序</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"># Definition for a binary tree node.
</span></span><span class="line"><span class="cl"># class TreeNode:
</span></span><span class="line"><span class="cl">#     def __init__(self, val=0, left=None, right=None):
</span></span><span class="line"><span class="cl">#         self.val = val
</span></span><span class="line"><span class="cl">#         self.left = left
</span></span><span class="line"><span class="cl">#         self.right = right
</span></span><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def kthSmallest(self, root: Optional[TreeNode], k: int) -&gt; int:
</span></span><span class="line"><span class="cl">        values = []
</span></span><span class="line"><span class="cl">        def visit(node):
</span></span><span class="line"><span class="cl">            if not node:
</span></span><span class="line"><span class="cl">                return
</span></span><span class="line"><span class="cl">            values.append(node.val)
</span></span><span class="line"><span class="cl">            visit(node.left)
</span></span><span class="line"><span class="cl">            visit(node.right)
</span></span><span class="line"><span class="cl">        visit(root)
</span></span><span class="line"><span class="cl">        values.sort()
</span></span><span class="line"><span class="cl">        return values[k-1]
</span></span></code></pre></td></tr></table>
</div>
</div><p>经典解法:中序遍历加技术:
BST的中序遍历是从小到大排序的,这个是迭代版本的,实质就是写中序遍历的过程,挺简单的</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def kthSmallest(self, root: Optional[TreeNode], k: int) -&gt; int:
</span></span><span class="line"><span class="cl">        stack = []
</span></span><span class="line"><span class="cl">        cur = root
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        while True:
</span></span><span class="line"><span class="cl">            while cur:
</span></span><span class="line"><span class="cl">                stack.append(cur)
</span></span><span class="line"><span class="cl">                cur = cur.left
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            cur = stack.pop()
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            k -= 1
</span></span><span class="line"><span class="cl">            if k == 0:
</span></span><span class="line"><span class="cl">                return cur.val
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            cur = cur.right
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="10二叉树的右视图">10.二叉树的右视图:</h3>
<h4 id="题目描述-4">题目描述:</h4>
<p>给定一个二叉树的 <strong>根节点</strong> <code>root</code>，想象自己站在它的右侧，按照从顶部到底部的顺序，返回从右侧所能看到的节点值。</p>
<h4 id="题解-3">题解:</h4>
<p>超绝队列配合层序遍历:结果就是层序遍历的每一层的最后一个值</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"># Definition for a binary tree node.
</span></span><span class="line"><span class="cl"># class TreeNode:
</span></span><span class="line"><span class="cl">#     def __init__(self, val=0, left=None, right=None):
</span></span><span class="line"><span class="cl">#         self.val = val
</span></span><span class="line"><span class="cl">#         self.left = left
</span></span><span class="line"><span class="cl">#         self.right = right
</span></span><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def rightSideView(self, root: Optional[TreeNode]) -&gt; List[int]:
</span></span><span class="line"><span class="cl">        if not root:
</span></span><span class="line"><span class="cl">            return []
</span></span><span class="line"><span class="cl">        quene = deque([root])
</span></span><span class="line"><span class="cl">        ans = []
</span></span><span class="line"><span class="cl">        while quene:
</span></span><span class="line"><span class="cl">            level = []
</span></span><span class="line"><span class="cl">            for _ in range(len(quene)):
</span></span><span class="line"><span class="cl">                node = quene.popleft()
</span></span><span class="line"><span class="cl">                if node.left:
</span></span><span class="line"><span class="cl">                    quene.append(node.left)
</span></span><span class="line"><span class="cl">                if node.right:
</span></span><span class="line"><span class="cl">                    quene.append(node.right)
</span></span><span class="line"><span class="cl">                level.append(node.val)
</span></span><span class="line"><span class="cl">            ans.append(level[-1])
</span></span><span class="line"><span class="cl">        return ans
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="11二叉树展开为链表">11.二叉树展开为链表:</h3>
<h4 id="题目描述-5">题目描述:</h4>
<p>给你二叉树的根结点 <code>root</code> ，请你将它展开为一个单链表：</p>
<ul>
<li>展开后的单链表应该同样使用 <code>TreeNode</code> ，其中 <code>right</code> 子指针指向链表中下一个结点，而左子指针始终为 <code>null</code> 。</li>
<li>展开后的单链表应该与二叉树 <a href="https://baike.baidu.com/item/%E5%85%88%E5%BA%8F%E9%81%8D%E5%8E%86/6442839?fr=aladdin"><strong>先序遍历</strong></a> 顺序相同。</li>
</ul>
<h4 id="题解-4">题解:</h4>
<p>找左子树的最右节点,并把原本的右子树接到那里</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def flatten(self, root: Optional[TreeNode]) -&gt; None:
</span></span><span class="line"><span class="cl">        cur = root
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        while cur:
</span></span><span class="line"><span class="cl">            if cur.left:
</span></span><span class="line"><span class="cl">                # 找左子树最右边的节点
</span></span><span class="line"><span class="cl">                pre = cur.left
</span></span><span class="line"><span class="cl">                while pre.right:
</span></span><span class="line"><span class="cl">                    pre = pre.right
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                # 原来的右子树接到这里
</span></span><span class="line"><span class="cl">                pre.right = cur.right
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                # 左子树搬到右边
</span></span><span class="line"><span class="cl">                cur.right = cur.left
</span></span><span class="line"><span class="cl">                cur.left = None
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            cur = cur.right
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="12从前序与中序遍历构造二叉树考408的来了你们聊">12.从前序与中序遍历构造二叉树(考408的来了,你们聊)</h3>
<h4 id="题目描述-6">题目描述:</h4>
<p>给定两个整数数组 <code>preorder</code> 和 <code>inorder</code> ，其中 <code>preorder</code> 是二叉树的<strong>先序遍历</strong>， <code>inorder</code> 是同一棵树的<strong>中序遍历</strong>，请构造二叉树并返回其根节点。</p>
<h4 id="题解-5">题解:</h4>
<p>思路:从先序遍历里面找到根节点,然后在中序遍历里面找到该节点,然后左边为其左子树,右边是其右子树,迭代或者递归进行</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def buildTree(self, preorder: List[int], inorder: List[int]) -&gt; Optional[TreeNode]:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        if not preorder:
</span></span><span class="line"><span class="cl">            return None
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        # 1. preorder 第一个节点是根
</span></span><span class="line"><span class="cl">        root_val = preorder[0]
</span></span><span class="line"><span class="cl">        root = TreeNode(root_val)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        # 2. 在 inorder 中找到根的位置
</span></span><span class="line"><span class="cl">        index = inorder.index(root_val)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        # 3. 划分左右子树
</span></span><span class="line"><span class="cl">        left_inorder = inorder[:index]
</span></span><span class="line"><span class="cl">        right_inorder = inorder[index + 1:]
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        # 左子树节点数量
</span></span><span class="line"><span class="cl">        left_size = len(left_inorder)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        # 4. 递归构建左右子树
</span></span><span class="line"><span class="cl">        root.left = self.buildTree(
</span></span><span class="line"><span class="cl">            preorder[1:left_size + 1],
</span></span><span class="line"><span class="cl">            left_inorder
</span></span><span class="line"><span class="cl">        )
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        root.right = self.buildTree(
</span></span><span class="line"><span class="cl">            preorder[left_size + 1:],
</span></span><span class="line"><span class="cl">            right_inorder
</span></span><span class="line"><span class="cl">        )
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        return root
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="13路径总和">13.路径总和:</h3>
<h4 id="题目描述-7">题目描述:</h4>
<p>给定一个二叉树的根节点 <code>root</code> ，和一个整数 <code>targetSum</code> ，求该二叉树里节点值之和等于 <code>targetSum</code> 的 <strong>路径</strong> 的数目。</p>
<p><strong>路径</strong> 不需要从根节点开始，也不需要在叶子节点结束，但是路径方向必须是向下的（只能从父节点到子节点）。</p>
<h4 id="题解-6">题解:</h4>
<p>暂留:</p>
<h3 id="14二叉树的最近公共祖先">14.二叉树的最近公共祖先</h3>
<h4 id="题目描述-8">题目描述:</h4>
<p>给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。</p>
<p><a href="https://baike.baidu.com/item/%E6%9C%80%E8%BF%91%E5%85%AC%E5%85%B1%E7%A5%96%E5%85%88/8918834?fr=aladdin">百度百科</a>中最近公共祖先的定义为：“对于有根树 T 的两个节点 p、q，最近公共祖先表示为一个节点 x，满足 x 是 p、q 的祖先且 x 的深度尽可能大（<strong>一个节点也可以是它自己的祖先</strong>）。”</p>
<h4 id="题解-7">题解:</h4>
]]></content:encoded>
    </item>
  </channel>
</rss>
