相交链表

作者: 第四单元 | 来源:发表于2018-05-01 12:43 被阅读0次

题目

编写一个程序,找到两个单链表相交的起始节点。

例如,下面的两个链表:

A: a1 → a2

c1 → c2 → c3

B: b1 → b2 → b3
在节点 c1 开始相交。

注意:

如果两个链表没有交点,返回 null.
在返回结果后,两个链表仍须保持原有的结构。
可假定整个链表结构中没有循环。
程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。

思路

首先要判断两个链表是否相交:是否有相同的尾节点
将问题转换为求链表环的入口节点:将尾节点指向链表B的头结点
环的长度即为链表b的长度,可在遍历时记录,设为n
两个指针一个先走n步,再一块走,当它们相遇时就指向的入口节点,即为所求交点
最后,别忘了把尾指针的next指向null

代码

import java.util.Scanner;
class ListNode {
    int val;
    ListNode next;
    ListNode(int x) {
        val = x;
        next = null;
    }
}

public class Solution {
    public static void main(String[] args) {
        Solution solution = new Solution();
        Scanner scanner = new Scanner(System.in);

        ListNode headA = new ListNode(1);
        headA.next = new ListNode(2);
        headA.next.next = new ListNode(3);
        headA.next.next.next = new ListNode(4);
        headA.next.next.next.next = new ListNode(5);

        ListNode headB = new ListNode(7);
        headB.next = new ListNode(8);
        headB.next.next = new ListNode(9);
        // headB.next.next.next = headA.next.next.next;

        ListNode p = solution.getIntersectionNode(headA,headB);

        if(p != null)
            System.out.println(p.val);
        else
            System.out.println("null");
    }

    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if(headA == null || headB == null) return null;
 
        //首先要判断两个链表是否相交:是否有相同的尾节点
        ListNode pA = headA;
        while(pA.next != null) 
         pA = pA.next;

        ListNode pB = headB;
        int countB = 1;
        while(pB.next != null) {
            pB = pB.next;
            countB++;
        }

        if(pA != pB) return null;
        
        //将尾节点指向链表B的头结点
        pB.next = headB;
        
        //两个指针一个先走n步,再一块走,当它们相遇时就指向的入口节点,即为所求交点
        ListNode p1 = headA,p2 = headA;
        
        while(countB > 0) {
            p1 = p1.next;
            countB--;
        }
        while(p1 != p2) {
            p1 = p1.next;
            p2 = p2.next;
        }

        pB.next = null;

        return p1;
    }
}

相关文章

  • 链表--相交链表

    目录[https://www.jianshu.com/p/85e18c21317a] 题号[https://lee...

  • 链表相交的问题(java)

    判断两个无环链表是否相交首先我们要知道相交是什么概念两个链表相交.png现在大家都知道了,两个链表相交,则两个链表...

  • 相交链表

    编写一个程序,找到两个单链表相交的起始节点。 注意: 如果两个链表没有交点,返回 null.在返回结果后,两个链表...

  • 相交链表

    相交链表 编写一个程序,找到两个单链表相交的起始节点。 注意: 如果两个链表没有交点,返回 null. 在返回结果...

  • 相交链表

    题目 编写一个程序,找到两个单链表相交的起始节点。 例如,下面的两个链表: A: a1 → a2...

  • 相交链表

    题目 难度级别:简单 编写一个程序,找到两个单链表相交的起始节点。 如下面的两个链表: 在节点 c1 开始相交。 ...

  • 相交链表

    题目描述:编写一个程序,找到两个单链表相交的起始节点。 示例: 输入:intersectVal = 8, list...

  • 相交链表

    题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/inte...

  • 相交链表

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

  • leetcode的题目160

    160. 相交链表 编写一个程序,找到两个单链表相交的起始节点。 例如,下面的两个链表: 在节点 c1 开始相交。...

网友评论

    本文标题:相交链表

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