美文网首页
两个链表重叠部分查找(Leetcode160)

两个链表重叠部分查找(Leetcode160)

作者: zhouwaiqiang | 来源:发表于2018-11-12 23:10 被阅读0次

题目

  • 两个链表重叠查找:给定两个链表,有可能链表从某一个节点开始就完全重叠,需要返回重叠部分的第一个节点值,如果没有重叠部分就返回null
  • 要求时间复杂度O(n),空间复杂度O(1)

解析

  • 如果不给定限制条件,这道题的做法有三种:
  • 第一种:我以第一个链表或者第二个链表作为匹配值,然后遍历另一个链表是否和当前值相等,就可以找到对应的值或者返回null,时间复杂度O(mn)空间复杂度O(1)
  • 第二种:将链表A或者B存储到哈希表中,然后利用哈希特性查找另一个链表是否含有其中的值,第一个含有的即为开始值,整个查找都没有结果返回null,空间复杂度O(n)或者O(m)时间复杂度O(m+n)
  • 第三种:按照数学特性,我假设一个节点first从A开始走,一个节点second从B开始走,当first走到A最后时此时从B的开始走,反之second从A开始走,如果他们有重叠部分,那么一定会在第一个值重叠的地方返回,如果整个遍历完成都没有重叠的值那么久返回null。如下图中所示:从A走过到C的距离就是x+z+y,同理从B走过的就是y+z+x这两个是相等的,所以可解。且满足题目要求O(m+n)空间复杂度O(1)
寻找相等路径

源代码

/**
 * 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 first = headA, second = headB;
        boolean markedA = false, markedB = false;
        while (first != null && second != null) {
            if (first == second) return first;//找到对应的节点
            if (first.next == null && !markedA) {
                first = headB;
                markedA = true;
            } else first = first.next;
            if (second.next == null && !markedB) {
                second = headA;
                markedB = true;
            } else second = second.next;
        }
        return null;
    }
}

相关文章

  • 两个链表重叠部分查找(Leetcode160)

    题目 两个链表重叠查找:给定两个链表,有可能链表从某一个节点开始就完全重叠,需要返回重叠部分的第一个节点值,如果没...

  • leetcode160-链表相交节点

    1 简介 题目传送门leetcode160。 这个问题主要解决的是,找寻两个链表中相交的链表。为此,我们首先应该明...

  • LeetCode 160. Intersection of Tw

    题意:不改变两个原始链表A,B的情况下找到两个链表开始重叠的那个节点,若没有重叠,则返回NULL;解法:假设A,B...

  • Leetcode160交叉链表

    题目 编写一个程序,找到两个单链表相交的起始节点。如下面的两个链表: 在节点 c1 开始相交。 示例 1:输入:i...

  • day03-双向链表

    双向链表: 单向链表只能单向查找,双向链表可以双向查找。 啥是双向链表? 双向链表可以双向查数据,所以就不存在单向...

  • 链表-查找两个链表的公共节点

    两个链表相交,查找两个链表的公共节点 eg:两个链表分别是:L1: 1->1->2->3->5->4->5L2: ...

  • 链表系列题目

    1.打印两个有序链表的公共部分 【题目】给定两个有序链表的头指针head1和head2,打印两个链表的公共部分。例...

  • InnoDB 索引

    链表 -> 二叉查找树 -> 平衡二叉树 -> B树 -> B+树 链表:层级等于链表长度二叉查找树:链表优化,...

  • 算法面经--双向链表

    双向链表 一、与单链表的对比凸显优势 ① 单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找。 ②...

  • leetcode160 链表相交节点

    leetcode160 Write a program to find the node at which the...

网友评论

      本文标题:两个链表重叠部分查找(Leetcode160)

      本文链接:https://www.haomeiwen.com/subject/lxbhfqtx.html