【链表】两个链表的第一个公共结点

题目:

输入两个链表,找出它们的第一个公共节点。

如下面的两个链表:

 

在节点 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;
    }
}

 

posted @ 2020-09-14 21:21  3KBLACK  阅读(96)  评论(0)    收藏  举报