Python3链表实现

Python015

Python3链表实现,第1张

链表: 其中的各对象按线性顺序排列,其顺序有各个对象里的指针决定,为动态集合提供了一种简单而灵活的表示方法。

双向链表: 每一个元素都是一个对象,每个对象有一个关键字key和两个指针:next和prev。如果元素x没有前驱,所以是链表的第一个元素head,若元素x没有后继,因此是链表的最后一个元素tail。如果L.hand=NIL,则链表为空。

4

开始遍历此链表

15

14

13

12

链表遍历已经结束

None

开始遍历此链表

15

14

111

13

12

链表遍历已经结束

None

开始遍历此链表

111

15

14

111

13

12

链表遍历已经结束

None

开始遍历此链表

111

111

15

14

111

13

12

链表遍历已经结束

None

难度:★★☆☆☆

类型:链表

编写一个程序,找到两个单链表相交的起始节点

如下面的两个链表:

在节点 c1 开始相交。

示例 1:

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3

输出:Reference of the node with value = 8

输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。

示例2:

输入:intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1

输出:Reference of the node with value = 2

输入解释:相交节点的值为 2 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [0,9,1,2,4],链表 B 为 [3,2,4]。在 A 中,相交节点前有 3 个节点;在 B 中,相交节点前有 1 个节点。

示例3:

输入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2

输出:null

输入解释:从各自的表头开始算起,链表 A 为 [2,6,4],链表 B 为 [1,5]。由于这两个链表不相交,所以 intersectVal 必须为 0,而 skipA 和 skipB 可以是任意值。

解释:这两个链表不相交,因此返回 null。

注意:

如果两个链表没有交点,返回 null.

在返回结果后,两个链表仍须保持原有的结构。

可假定整个链表结构中没有循环。

程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。

这道题与 【题目141. 环形链表】 属于同一题型,环形链表可以使用快慢指针判断,这里我们同样使用双指针进行判别,不过步长都是一步,让两个指针分别从两个链表头结点开始向后移动,当其中一个指针走到链表末尾后,换到另一个链表的头结点上,另一个指针也是如此,这样如果两个链表相交,则一定可以相遇,且根据数量关系可知,首次相遇的结点即为相交结点。

如有疑问或建议,欢迎评论区留言~