问题描述
如图所示,两个单链表在结点C1处融合为一个链表。题目要求我们找到这个结点。
问题分析
解法一:
常规的解法是对这两个链表分别遍历一遍,计算出他们的长度差n。然后长的链表先走n步,两个链表再一起走。
解法二:
对两个链表同时开始遍历。设链表A上的指针是pA,链表B上的指针是pB。当pA走到链表A的某尾后,就让pA指向链表B的头部;同理pB走完后,就指向A的头部。如果这两个链表的长度有差异,那么当最后一个指针指向另一个 链表的头部时,就相当于解法一中,先让长的链表走n 步了。该答案来自LeetCode用户hpplayer。下面我贴出完整代码。
/**
* 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) {
if(headA == null || headB == null) return null;
ListNode pA = headA, pB = headB;
while(pA != pB) {
pA = pA == null ? headB: pA.next;
pB = pB == null ? headA: pB.next;
}
return pA;
}
}