找两个链表的公共节点

简介:

首先考虑两个链表无环的情况。

将链表a的尾节点指向头节点从而形成环。用快慢指针遍历链表b,一个一次移动2单位,另一个移动1单位。如果不相遇则不存在公共节点。如果相遇,则让其中一个指针指向b,两个指针以1单位/次的速度移动,直到相遇。相遇时指向的节点就是公共节点的起始。最后记得将a的尾节点恢复。代码如下。

其次考虑有环的情况。用快慢指针探测a中是否有环。如果有则,将使p指向a的尾节点,p的next指向null。按照上面的方法遍历b。如果遍历的过程中遇到p,则将p指向a继续遍历。如果未遇到p或者无环,则不存在公共节点。最后仍然将a的尾节点恢复。


static class LinkedList {
    LinkedList next;
    public LinkedList(LinkedList next) {
        this.next = next;
    }
}

static LinkedList calc(LinkedList a, LinkedList b) {
    // set tail point to a
    LinkedList p = a;
    while (p.next != null) {
        p = p.next;
    }
    p.next = a;

    if (b == null || b.next == null)
        return null;
    LinkedList fast = b.next.next, slow = b.next;
    while (fast != null && fast.next != null && fast != slow) {
        fast = fast.next.next;
        slow = slow.next;
    }
    if (fast != slow) {
        return p.next = null;
    } else {
        slow = b;
        while (fast != slow) {
            fast = fast.next;
            slow = slow.next;
        }
        p.next = null;
        return slow;
    }
}

public static void main(String[] args) {
    LinkedList common = new LinkedList(new LinkedList(new LinkedList(null)));
    LinkedList a = new LinkedList(new LinkedList(common));
    LinkedList b = new LinkedList(new LinkedList(new LinkedList(
            new LinkedList(common))));
    LinkedList r = calc(a, b);
    System.out.println(r == common);

}


目录
相关文章
|
8天前
|
算法
【优选算法专栏】专题九:链表--------两两交换链表中的节点
【优选算法专栏】专题九:链表--------两两交换链表中的节点
16 0
|
3月前
【Leetcode 2487】从链表中移除节点 —— 单调栈
解题思路:维持一个单调递增栈,当栈为空时,记录当前节点为头节点;否则当前节点为栈顶节点的后继节点
|
3月前
leetcode-382:链表随机节点
leetcode-382:链表随机节点
17 0
|
1月前
leetcode2487.从链表中移除节点
leetcode2487.从链表中移除节点
20 1
|
1月前
|
C语言
【C语言】Leetcode 876. 链表的中间节点
【C语言】Leetcode 876. 链表的中间节点
15 0
|
1月前
|
设计模式 测试技术
在实现链表的代码中,为什么要使用`Node`类而不是直接在`LinkedList`类中定义节点?
在实现链表的代码中,为什么要使用`Node`类而不是直接在`LinkedList`类中定义节点?
20 1
|
2月前
|
Java
LeetCode题解- 两两交换链表中的节点-Java
两两交换链表中的节点-Java
13 0
|
2月前
|
Java C++ Python
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-456 求链表各节点的平均值(C++解法)
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-456 求链表各节点的平均值(C++解法)
29 0
|
3月前
|
Rust 索引
Rust 编程小技巧摘选(6)
Rust 编程小技巧摘选(6)
45 1
Rust 编程小技巧摘选(6)
|
3月前
|
Java Go C++
Golang每日一练(leetDay0114) 矩阵中的最长递增路径、按要求补齐数组
Golang每日一练(leetDay0114) 矩阵中的最长递增路径、按要求补齐数组
33 0
Golang每日一练(leetDay0114) 矩阵中的最长递增路径、按要求补齐数组