两个链表的第一个公共节点
关键词:双指针、链表长度
题目描述
输入两个链表,找出它们的第一个公共节点。
如下面的两个链表:
在节点 c1 开始相交。
示例 1:
1 |
|
示例2:
1 |
|
示例3:
1 |
|
注意:
- 如果两个链表没有交点,返回 null.
- 在返回结果后,两个链表仍须保持原有的结构。
- 可假定整个链表结构中没有循环。
- 程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。
解法
解法一:
思路:
- 相交节点之后的节点都相等
- 取消链表长度不同的干扰
算法流程:
- 初始化: pa = headA; pb = headB;
- 两个链表同时向前,直到一个链表走到尽头;
- 记录两个链表相差的节点数,让长的链表先走这些节点数;
- 此时两个链表剩下的节点数一致,判断之后是否有相同的节点。
代码:
1 |
|
解法二:
思路:
- 同一。
算法流程:
我们使用两个指针 node1,node2 分别指向两个链表 headA,headB 的头结点,然后同时分别逐结点遍历,当 node1 到达链表 headA 的末尾时,重新定位到链表 headB 的头结点;当 node2 到达链表 headB 的末尾时,重新定位到链表 headA 的头结点。
这样,当它们相遇时,所指向的结点就是第一个公共结点。
代码:
1 |
|
知识点
- 双指针的使用。
- 消除链表长度影响的方法。