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

45 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第24天,点击查看活动详情

题目

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

解题思路

关键词:链表;公共节点;长度不同

关键信息:公共重合链表结构;存在或不存在相同节点

哈希解法

哈希解法思路:先遍历其中一个链表并存下整个链表每个节点。然后再遍历另外一个链表找到是否存在相同节点输出。

  1. 先创建一个哈希表来保存链表节点。
  2. 循环一个链表并存下节点。
  3. 再循环另外一个链表判断是否存在相同节点。
  4. 执行contains包含该节点就返回结果。
    ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        Set<ListNode> nodes = new HashSet<ListNode>();
        ListNode temp = headA;
        while (temp != null) {
            nodes.add(temp);
            temp = temp.next;
        }
         ListNode temp2 = headB;
        while(temp2 != null){
            if(nodes.contains(temp2)){ // 是否有一样的值
                return temp2;
            }
            temp2 = temp2.next;
        }
        return null;
    }

双指针解法

双指针解法思路可以理解为龟兔赛跑算法(当两个链表长度不一致的时候)。

  1. 如果两个链表长度一样的话,到链表尾部同时指向null,结果为null。
  2. 如果两个链表长度不一样,那么当链表循环到尾部后切换为另外一个链表进行循环。
  3. 比如链表a长度为x,链表b长度为y,他们若有公共节点链表结构应该是x = aa +c;y = bb +c;
  4. c是他们公共节点长度,aa和bb是他们前置节点内容。
  5. 当他们循环到 aa +c + bb和bb + c + aa时长度一致且在同一个公共节点就能得到他们存在公共节点。
  6. 同样上述证明不成立也能证明他们没有公共节点。
ListNode getIntersectionNode(ListNode headA, ListNode headB) {
 	ListNode fastNode = headA,lowNode = headB;
    // a和b互相切换直到两者跑到同一个节点
 	while(fastNode != lowNode){ // 只有当节点都指向尾结点空和存在相同节点时才会结束。
 	    fastNode = fastNode  != null ? fastNode.next : headB; // 
 	    lowNode = lowNode != null ? lowNode.next : headA;
 	}
 	return fastNode;
}

参考