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

题目描述

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

时间限制:1秒 空间限制:32768K

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/

解体思路:

  • 注意:由于单链表只有一个指针,因此,从第一个公共结点开始,后面的链表都是公共的部分

1、暴力破解:直接遍历两个链表,时间复杂度为O(m*n)

public class Solution {
    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
        ListNode p1=pHead1,p2;
        while(p1!=null){
            p2=pHead2;
            while(p2!=null){
                if(p1==p2) return p1;
                p2=p2.next;
            }
            p1=p1.next;
        }
        return null;
    }
}

2、将两个链表拼接起来,遍历得到的第一个相同的结点就可以,时间复杂度为O(m+n)
(1)假如两个链表有公共结点

有公共节点的链表示意图

拼接起来后,p1、p2的遍历顺序如下,遍历到6时就返回结点了
p1遍历的顺序是(9,8,6,8,[null] 1,6,8)
p2遍历的顺序是(1,6,8,[null] 9,8,6,8)

(2)如果没有公共结点,那么最后返回null

无公共结点的链表

拼接起来后,p1、p2的遍历顺序如下,遍历到null时就返回结点了
p1遍历的顺序是(9,8,6,8,[null] 1,7,6,null
p2遍历的顺序是(1,7,6,[null] 9,8,6,8,null

public class Solution {
    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
        ListNode p1=pHead1,p2=pHead2;
        while(p1!=p2){
            p1= p1==null? pHead2 : p1.next;
            p2= p2==null? pHead1 : p2.next;
        }
        return p1;
    }
}

你可能感兴趣的:(两个链表的第一个公共结点)