文章目录
概要
链表
(Linked List)是数据结构中的一种,用于存储具有线性关系的数据。在链表中,每个元素称为一个节点(Node),每个节点包含两个部分:一个是数据域
(存储数据),另一个是指针域
(指向下一个节点)。链表的结构使得它在某些情况下比数组更加高效,特别是在插入
和删除
操作上。
链表的类型
-
单向链表(Singly Linked List):
- 每个节点只有一个指向下一个节点的指针。
- 头节点(Head)是链表的起点,尾节点(Tail)指向 null。
-
双向链表(Doubly Linked List):
- 每个节点有两个指针,分别指向前一个节点和下一个节点。
- 头节点的前指针和尾节点的后指针都指向 null。
-
循环链表(Circular Linked List):
- 单向链表或双向链表的变种。
- 尾节点的下一个指针指向头节点,形成一个循环。
题目:相交链表
原题链接:相交链表
题解
核心:其实就是让2个指针走一样的距离,消除步行差,那就一定可以一起走到相交点
因为两个链表如果相交,则它们从相交点到结尾的所有节点都是相同的。因此,我们让指针 p1 和 p2 分别遍历两个链表。如果 p1 到达链表 A 的末尾,则将其重定位到链表 B 的头部;同样地,如果 p2 到达链表 B 的末尾,则将其重定位到链表 A 的头部。这样,两指针最终会在相交点处相遇,即第一个共同节点,即为相交点。
java
public static ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode p1 = headA;
ListNode p2 = headB;
while (p1 != p2) {
p1 = p1 == null ? headB : p1.next;
p2 = p2 == null ? headA : p2.next;
}
return p1;
}
评论区看到一个【还有句话:走到尽头见不到你,于是走过你来时的路,等到相遇时才发现,你也走过我来时的路。】
java
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode she = headA;
ListNode he = headB;
// 直到两人相遇
while (she != he) {
if (she != null) {
she = she.next;// 如果她没走到尽头就一直走下去
} else {
she = headB;// 直到尽头也没遇见他,所以她去往他走过的路
}
if (he != null) {
he = he.next;
} else {
he = headA;
}
}
return he;// 返回两人第一次相遇的地方
}