• Chp2: Linked List


    2.2 Implement an algorithm to find the kth to last element of a singly linked list.

    Just using "runner" tech,let the first pointer to run for k step, then start the second pointer, at the same speed.

    When the first one hit the end, the second one is just on the kth element.

     2.5 

    (1) input: (7 -> 1 -> 6) + (5 -> 9 -> 2) , that is 617 + 295

     output: (2 -> 1 -> 9), that is 912.

    solution: int add = new int[max(linklist1.length,linklist2.length) + 1];

                7 -> 1 -> 6

             5 -> 9 -> 2

    add:      0,    1,     1,    0
                2 -> 1 -> 9

    (2) input: (6 -> 1 -> 7) + (2 -> 9 -> 5),that is 617 + 295

       output: (9 -> 1 -> 2)

    solution: just add by index, put the number larger than 10 in to array. then add again, until all the number in array is 0.

           6 -> 1 -> 7

           2 -> 9 -> 5

    add: 8 ->10->12   >>=>>  8 -> 0 -> 2

                                             1,    1,     0 

                                            9 -> 1 -> 2

    2.6

    题目:①判断一个单向链表是否有环,如果有环则找到环的入口节点。

              ②判断两个单向链表是否相交,如果相交则找到交点节点。

    算法思想:①用两个指针p1,p2同时指向链表的头部,p1一次移动一步,p2一次移动两步,如果最终p1和p2重合则说明链表有环,如果p2走到空指针(链表的结尾)则说明链表无环。如果最终p1和p2重合,使p2重新指向链表的头结点,然后p1和p2同时一次移动一步,当p1和p2再次重合时该节点指针就是环的入口节点指针。

    给定一个有环的链表,写一个算法,找出环的起点。

    例如:输入:A->B->C->D->E->C[与前面的C是同一个节点]

             输出:C

    判断一个链表是否存在环有一个简单的方法:就是使用一个快指针、和一个慢指针,快指针每次走两步,慢指针每次走一步,则如果有环,它们最后必然会相遇的。

    本题的难点在于要找出环的起点。其实也不难,与判断是否有环类似,用两个步长分别为1和2的指针遍历链表,直到两者相遇,此时慢指针走过的长度就是环的长度。

    另外相遇后把其中指针重新设定为起始点,让两个指针以步长1再走一遍链表,相遇点就是环的起始点。

    证明也很简单,证明如下:我们注意到第一次相遇时:慢指针走过的路程S1 = 非环部分长度 + 弧A长,

                                快指针走过的路程S2 = 非环部分长度 + n * 环长 + 弧A长,

                            S1 * 2 = S2,

    可得 非环部分长度 = n * 环长 - 弧A长。

    让指针A回到起始点后,走过一个非环部分长度,指针B走过了相等的长度,也就是n * 环长 - 弧A长,正好回到环的开头。

                    ②有了第一问的算法基础,应该不难理解第二问。首先将其中一个链表list1首尾相接,变成一个有环链表,如果另一个链表list2和list1相交的话,list2也将成为一个有环链表,并且环的入口节点就是两个链表的交叉节点。如果两个链表不相交,则list2依然是一个无环链表。

    2.7 palindrome 首先考虑使用stack来存储,这样极其简洁。

  • 相关阅读:
    git操作
    计算天数
    web小结~2019.3.24
    数据统计值的计算+PYTHON
    python~序列类型及操作
    一个日期加上若干天后是什么日期
    完数与盈数
    分段函数
    求最大最小
    D进制的A+B
  • 原文地址:https://www.cnblogs.com/reynold-lei/p/3314156.html
Copyright © 2020-2023  润新知