题解 | 两个链表的第一个公共结点

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

https://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46

我们注意到,题目中明确说明了两个链表都是无环的链表,这其实就是一个暗示:我们可以人为的生成一个环来解答此题。步骤如下:
	1.我们先把任意一个链表遍历到尾节点。
	2.将尾节点指向另一个链表的头节点。这样如果两条链表有公共节点,则一定会形成一个有环链表。如果没有,则还是
无环链表。
	3.至此,此问题就变成了问题BM7了,后续不再赘述。
不过需要注意的是,当我们找到第一个公共节点时,需要将尾节点和头节点的链接断开,否则提交会报错。
import java.util.*;
/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
        if(pHead1 == null || pHead2 == null){
            return null;
        }
        ListNode cP1 = pHead1;
        while(cP1.next != null){//遍历到尾节点
            cP1 = cP1.next;
        }
        cP1.next = pHead2;//将两者链接
        ListNode fast = pHead1;//快指针
        ListNode slow = pHead1;//慢指针

        while (fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;
            //相遇之后再添加一个慢指针
            if (fast == slow) {
                ListNode slow2 = pHead1;
                while (slow != slow2) {
                    slow2 = slow2.next;
                    slow = slow.next;
                }
                cP1.next = null;//断开头尾。
                return slow;
            }
        }
        //若不形成环则说明没有公共节点。
        return null;
    }
}

全部评论

相关推荐

03-17 23:54
黑龙江大学 Java
来个白菜也好啊qaq:可以的,大厂有的缺打手
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务