3月23日报(链表)
- 完成了矩阵板块,已添加到 3月19 日报
- 做了点链表题
相交链表
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。
图示两个链表在节点 c1 开始相交 :
题目数据 保证 整个链式结构中不存在环。 注意,函数返回结果后,链表必须 保持其原始结构 。
思路解析
当我们无路可走时,试着走彼此的路. 如果到最后我找不到你,那么你也找不到我,我们没有缘分了(?)
设「第一个公共节点」为 node ,「链表 headA」的节点数量为 a ,「链表 headB」的节点数量为 b ,「两链表的公共尾部」的节点数量为 c 借灵神个图 
于是我们有以下流程 若是两条链不相交,因为 a2 和 b3 的下一个节点都是空节点, 可以视作在空节点相交 由于 x + y = y + х,两个指针最终都会走到空节点 具体算法如下:
- 初始化指针 A、B;
- 持续循环,直至 A = B;
- 每一次循环都会使两个指针都向后一步,直到遇到 null
- 循环结束,如果两链表相交,则 A 与 B 在链表相交处,返回答案;如果不相交,A 和 B 都在空节点,直接返回答案
代码实现
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode A = headA, B = headB;
while (A != B) {
A = A != null ? A.next :headB;
B = B != null ? B.next : headA;
}
return A;
}
}