• 线性表-链表


    一、链表

    链表的题目一般不难,主要考查coding能力。

    1.链表相加

    给定2个链表,分别表示2个非负整数。它们的数字逆序存储在链表中,且每个结点只存储一个数字。计算这两个数的和,并返回和的链表头指针。

    【分析】leetcode第2题。

    逆序存储的好处是,可以从头指针开始,逐位计算当前位和进位,依次放入表示和的链表中。

    【扩展思路】上述逆序链表这个结构其实非常巧妙,还可以用来实现大数运算。(我以前都是用数组做=,=,数组的好处是可以随机访问,做乘法方便定位,,但链表做乘法嘛……呃,需要多用辅助指针……)

    【我的代码:4ms】

    image

    2. 链表翻转

    给定一个链表,翻转该链表第m到第n个位置。要求直接翻转而非申请新空间。如,给定1,2,3,4,5,m=2, n=4, 返回1,4,3,2,5。

    【分析】leetcode 第92题。

    一般使用头插法,把后面的结点依次插入头结点前面,注意是依次。这样,只需要一个指针记录参考结点,一个指针遍历待翻转结点,一个计数器。

    【我的代码】0ms

    image

    3.链表去重

    给定排序的链表,删除重复元素,只保留第一次出现的结点。

    【分析】leetcode第83题。

    很简单,因为链表已经有序了,直接删除后面相同的元素即可。

    【我的代码】1ms。

    image

    4. 链表划分

    给定一个链表和一个值x,将链表划分为两部分,使得小于x的结点在前,大于等于x的结点在后。在这两部分中要保持原链表中的出现顺序。

    【分析】leetcode第86题。

    有点类似于快排中的partition过程。但注意到链表的特殊结构,可以直接申请2个指针,把小于x的结点都插入第一个指针后面,大于等于x的结点都插入第2个指针后面,最后再把这2个链表接起来就可以了。时间复杂度为n,空间为2.

    【思路扩展】快速排序也可以用单链表结构存储。但注意不是所有排序都适合单链表结构,比如堆排序就不适合。

    【我的代码】1ms。

    image

    5.单链公共结点问题

    给定2个单向链表,计算两个链表的第一个公共结点。若没有公共结点,返回空。

    【分析】leetcode第160题。

    注意是单向链表,所以在公共结点之后的所有结点是相同的,不可能出现x形结构。因此,可以先遍历2个链表,得到长度m,n。然后长链表先走|m-n|步,然后同步走,直到指向同一个结点。

    【思路扩展】如果是链表中存在环,则需要用快慢指针的方式计算公共结点。即2个指针,每次分别移动1步或2步。

    【我的代码】2ms。

    image

    流年素心 http://www.cnblogs.com/lddbupt/
  • 相关阅读:
    移动端图片按比例裁剪
    bootstrap悬停下拉菜单显示
    videojs兼容ie8
    ie浏览器不支持多行隐藏显示省略号
    rem和px
    浏览器默认返回,页面刷新
    centos src compile gcc 7.3
    docker与gosu
    centos 安装 kernel
    docker proxy
  • 原文地址:https://www.cnblogs.com/lddbupt/p/5477149.html
Copyright © 2020-2023  润新知