题目
输入两个链表,找出它们的第一个公共节点。
如下面的两个链表:
在节点 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。
思路
方法1:
将两个链表的长度统一为较短链表的长度,然后遍历查找
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA == null || headB == null){
return null;
}
int lenA = 0;
int lenB = 0;
ListNode cur1 = headA;
ListNode cur2 = headB;
//计算链表A的长度
while(cur1 != null){
lenA++;
if(cur1.next != null){
cur1 = cur1.next;
}else{
break;
}
}
//计算链表B的长度
while(cur2 != null){
lenB++;
if(cur2.next != null){
cur2 = cur2.next;
}else{
break;
}
}
//将她两重新指向头节点
cur1 = headA;
cur2 = headB;
//两个if分别表示两种清况, 将两个链表的长度统一为较短链表的长度
if(lenA > lenB){
while(lenA != lenB){
cur1 = cur1.next;
lenA--;
}
}
if(lenA < lenB){
while(lenA != lenB){
cur2 = cur2.next;
lenB--;
}
}
//统一完后,,然后遍历查找
while(cur1 != cur2){
if(cur1.next!=null ){
cur1 = cur1.next;
cur2 = cur2.next;
}else{
return null;
}
}
return cur2;
}
}
方法2:
两个for循环嵌套,将链表A的节点分别和链表B的每一个节点进行对比
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA == null || headB == null){
return null;
}
for(ListNode cur1 = headA; cur1!=null;cur1 = cur1.next){
for(ListNode cur2 = headB;cur2!=null;cur2 = cur2.next){
if(cur1 == cur2){
return cur1;
}
}
}
return null;
}
}
方法3
双指针,利用两个链表的节点和相同。
链表A 遍历完后再遍历B直到公共节点的个数 = 链表B遍历完自身后在遍历A到公共节点前的个数
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA == null || headB == null){
return null;
}
ListNode cur1 = headA;
ListNode cur2 = headB;
while(cur1 != cur2){
//cur1 != null说明此时还没遍历完它自身,等于空时,让他指向headB,再遍历headB直到公共节点
if(cur1 != null){
cur1 = cur1.next;
}else{
cur1 = headB;
}
// //cur2 != null说明此时还没遍历完它自身,等于空时,让他指向headA,再遍历headA直到公共节点
if(cur2 != null){
cur2 = cur2.next;
}else{
cur2 = headA;
}
}
return cur1;
}
}
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/liang-ge-lian-biao-de-di-yi-ge-gong-gong-jie-dian-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。