1111111111111 算法汇总
如何找到两个相交链表对交点? 如果两个单向链表有公共节点,则两个链表会构成Y型结构,最后一个节点相同 我们可以从头开始遍历两个链表,找到最后一个节点的指针,设为p_a,p_b。同时记录下两个链表的长度len_a,len_b(假设len_a >= len_b)。 如果p_a == p_b,则说明两个链表有公共节点,否则没有。 如果有公共节点,则第一个公共节点距起始节点的距离满足 len_a - start_a == len_b - start_b。 所以第一个可能的公共节点距起始节点的距离是 len_a - len_b, 0。我们从这两个节点开始比较,直到找到第一个公共节点。 单向链表中,如何在给定节点前快速插入一个节点? 对于单向链表来说,在某个节点后面插入一个新节点是非常快的。 所以我们可以在给定节点后面插入一个新节点,然后交换给定节点和新节点的数据即可。 找到链表的倒数第m个节点 方法1: 首先遍历链表,统计链表的长度N。 然后再次遍历链表,找到第N-m+1个节点,即为倒数第m个节点。 方法2: 使用两个指针,并使它们指向的节点相距m-1个。 然后同时向前移动两个指针,当一个指针指最后一个节点时,第二个指针指向倒数第m个节点。 两个方法的复杂度都是O(n)。 但是当N较大而m较小时,方法2可能会更快一些。因为方法2能更好利用CPU的缓存。 更多阅读: http://baike