Charles Z.

【算法总结】链表问题总结


经验之谈

  • 链表题目中基本所有的题目的解法的时间复杂度都是O(n),如果你设计的方法时间复杂度是O(n2),那基本上可以排除这种解法了
  • 求解链表问题,可以尝试使用转换的方法。请看下面这个问题

    求两个无环链表是否相交?

  • 一种很常见的trick是使用两个指针,一个每次走两步,另一个每次走一步

    求一个链表中间的节点(已知链表节点的个数是双数)

题目解析

给出两个单向链表的头指针h1,h2,判断两个链表是否相交

这是一个题目看起来很简单,但实际解决起来颇为麻烦的一道题。难点在于情况是否考虑周到

首先考虑到链表是否是有环的:(1)如果两个链表都是无环链表,那么只需要判断两个链表的尾指针是否相等;(2)如果链表一个有环一个无环,那么肯定不相交;(3)如果两个链表都是有环的,那么请看后文解析。

怎么判断两个链表有/无环的情况呢。用到上文所述的技巧,使用两个指针,最开始都同一个表头,指针a每次走1步,指针2每次走两步。如果量表是有环的,那么这两个指针最终一定会相遇,并且相遇的地点是在环内的某处。

知道了怎么判断有无环的方法,我们可以使用该方法检测链表h1和h2是否是有环的,如果两个链表都有环,就是这种情况:指向h1的指针a1,b1相较于环内某点x1,指向h2的指针a2,b2指向环内的某点x2。

那么我们可以重新遍历h2链表:从x2开始,依次向后走,如果在回到x2之前与x1相遇,则两个链表相交。

Show Comments