<?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>链表 on On My Way</title>
    <link>https://tuanzi-wow.cn/tags/%E9%93%BE%E8%A1%A8/</link>
    <description>Recent content in 链表 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/tags/%E9%93%BE%E8%A1%A8/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-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>
  </channel>
</rss>
