【链表】两个链表的第一个公共结点
题目:
输入两个链表,找出它们的第一个公共节点。
如下面的两个链表:

在节点 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 个节点。
解答:
方法一:
先分别遍历两个链表,计算它们的长度m,n。设置两个指针,将长的链表的指针向前移动m-n(假设m>n)个节点。然后同时移动两个指针,当两个指针的值第一次相同时,就找到了第一个公共节点。
/** * 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 pA = headA,pB = headB; int cntA = 0,cntB = 0,k; boolean isA; while(pA!=null){ cntA++; pA = pA.next; } while(pB!=null){ cntB++; pB = pB.next; } if(cntA>cntB){ k = cntA - cntB; isA = true; } else{ k = cntB-cntA; isA = false; } pA = headA; pB = headB; if(isA){ for(int i = 0;i<k;i++){ pA = pA.next; } } else{ for(int i = 0;i<k;i++){ pB = pB.next; } } while(pA!=pB){ pA = pA.next; pB = pB.next; } return pA; } }
方法二:双指针法,浪漫相遇 (leetcode题解)

两个链表长度分别为L1+C、L2+C, C为公共部分的长度,按照楼主的做法: 第一个人走了L1+C步后,回到第二个人起点走L2步;第2个人走了L2+C步后,回到第一个人起点走L1步。 当两个人走的步数都为L1+L2+C时就两个人就相遇了。
/** * 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 pa = headA,pb = headB; while(pa!=pb){ if(pa!=null) pa = pa.next; else if(pa == null) pa = headB; if(pb!=null) pb= pb.next; else if(pb == null) pb = headA; } return pa; } }

浙公网安备 33010602011771号