算法分析 [指针,链表] 2019-02-22

ListNode h = new ListNode(-1);
h.next = head;
ListNode cur = h;

cur引用的改变是不会影响h的引用指向地址,只有当cur第一次.next变化的时候,会直接影响到h的引用执行地址
记住h, cur分别是一个引用对象,指向同一个存储地址
cur的变化,只是指向新的存储地址,而h的指向不变
指针删除的时候,一定要使用头指针

1. 双指针解法

单链表有几个特性

  1. 设置一个target,用fast先走,走到step后,fast和slow一起走,直到fast走完,slow走的就是链表长度的从后往前的step长
  2. 有长短链表,想找到2个链表的后部一样长度,长短链表一起走,短链表走往开始走长链表,长链表多出的走完走短链表,之后两个链表就处于一个位置了

1.1 给定一个单链表,判断链表中是否有环

141. 链表判断环,只判断是否存在 Linked List Cycle easy
法1. 时间复杂度 -> 无环O(n),有环O(n+k), 空间复杂度O(1)
只是简单判断是否存在相遇跑圈,一人快一人慢,总有一圈会碰上
使用双指针法slow和fast两个指针slow速度是1fast速度是2
如果有环,fast最终与slow相遇
如果没有环,fast最终指向重点

142. 链表判断环,获取循环开始下标 Linked List Cycle II medium
在前面的查找循环示例中,假设我们每次移动较快的指针 2 步,每次移动较慢的指针 1 步。

如果没有循环,快指针需要 N/2 次才能到达链表的末尾,其中 N 是链表的长度。
如果存在循环,则快指针需要M 次才能赶上慢指针,其中 M 是列表中循环的长度

和前一题区别是,可能n次入循环才找到相遇节点,并且这个相遇点不是循环起始点的,只是相遇的一点
我的理解:
先确定有环,并且找到相遇的节点,由于v(fast) = v(2 * slow),因此相遇时,distance(fast)=distance(2*slow)
那只要大家一起从0位置开始走,slow从头开始fast向后走一步,同时开始一步一步走,走的次数n就是循环开始的节点

解题思路:分两个步骤,首先通过快慢指针的方法判断链表是否有环;接下来如果有环,则寻找入环的第一个节点。具体的方法为,首先假定链表起点到入环的第一个节点A的长度为a【未知】,到快慢指针相遇的节点B的长度为(a + b)【这个长度是已知的】。现在我们想知道a的值,注意到快指针p2始终是慢指针p走过长度的2倍,所以慢指针p从B继续走(a + b)又能回到B点,如果只走a个长度就能回到节点A。但是a的值是不知道的,解决思路是曲线救国,注意到起点到A的长度是a,那么可以用一个从起点开始的新指针q和从节点B开始的慢指针p同步走,相遇的地方必然是入环的第一个节点A。 文字有点绕,画个图就一目了然了~

1.3 两个单链表,查找共同后缀相交链表

160. 相交链表 Intersection of Two Linked Lists easy
有长短链表,想找到2个链表的后部一样长度,长短链表一起走,短链表走往开始走长链表,长链表多出的走完走短链表,之后两个链表就处于一个位置了

1.4 删除链表中从尾数第n个值,返回链表

19. 删除链表的倒数第N个节点 Remove Nth Node From End of List medium
法1. 时间复杂度O(2L),先统计链表长度,再倒数计算
法2. 时间复杂度O(L),设置一个target,用fast先走,走到step后,fast和slow一起走,直到fast走完,slow走的就是链表长度的从后往前的step长

1.5 对链表进行排序,奇数排前面偶数排后面

328. 奇偶链表 Odd Even Linked List medium
时间复杂度O(n),空间复杂度O(1)
需要用到三个指针,一个是奇数指针odd,一个偶数指针even,一个指向尾偶数最尾部的下一个指针ep。
此指针可以获取到下一个奇数和偶数,这样odd和even指针都可以变动

1.6 判断回文数

234. 回文数单链表 Palindrome Linked List easy
法1. 时间复杂度O(n),空间复杂度O(1)
使用双指针,slow,fast先定位到中位数,同时使用一个curslow走过的节点反转,如果fast.next==null说明是奇数个值,cur不做入值操作,否则是偶数个值需要入值
然后将slow和cur遍历对比

680. 允许删除一个字符判断字符串是否是回文数 Valid Palindrome II easy
法1. 时间复杂度O(n),空间复杂度O(1)
因为只允许删除一个值,因此当出现一次不一致的时候,排除左边/右边的值下标,继续后续回文数判断

1.7 合并两个列表

21. 合并两个有序链表 Merge Two Sorted Lists easy
法1.时间复杂度O(n),空间复杂度O(1)
使用头指针h,如果l1为空,就把l2放到h2的下一节点,否则相反。否则,如果l1大,入节点,否则l2入节点。返回头结点的下一节点

88. 合并有序数组 Merge Sorted Array easy
法1. 时间复杂度O(n),空间复杂度O(1)
需要从尾开始遍历,否则在 nums1 上归并得到的值会覆盖还未进行归并比较的值

1.8 对两链表进行累加

2. 两数相加 Add Two Numbers medium
时间复杂度O(max(m,n)),空间复杂度O(max(m,n))
一起相加,要判断是否进一位,如果有一个链表比另一个大,值也要与进位相加考虑
445. 两数相加 Add Two Numbers II medium
解法和一 一样,区别是,先对链表倒排,然后对累加的数也进行倒排

2. 双向链表

2.1 多重双向链表,父子合并成一条串行

430. 扁平化多级双向链表 Flatten a Multilevel Doubly Linked List medium
遍历父链表,每个节点调用合并函数
判断节点node是否存在子链表,如果存在,记录链表头first,对子链表进行遍历,直到最后一个不存在子链表的节点,获得链表尾last,对node进行插入子链表操作,需要考虑node没有后继的情况
改善方法,变成可以复用的方法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容