1. 程式人生 > >劍指offer-36:兩個連結串列的第一個公共結點

劍指offer-36:兩個連結串列的第一個公共結點

題目描述

輸入兩個連結串列,找出它們的第一個公共結點。

思路

如果兩個連結串列有共同結點,那一定是Y結構而不是X結構,以為單鏈表只有一個next。如下圖。
在這裡插入圖片描述
找出兩個連結串列的長度差,長的先遍歷長度差的距離,然後依次對比。

程式碼

public class Solution36 {

    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
        if(pHead1==null||pHead2==null)
            return null;
        int
len1=getlen(pHead1); int len2=getlen(pHead2); if(len1>len2){ int len=len1-len2; while(len-->0) pHead1=pHead1.next; }else{ int len=len2-len1; while(len-->0) pHead2=pHead2.next; } while
(pHead1!=null&&pHead2!=null){ if(pHead1.val==pHead2.val) return pHead1; else{ pHead1=pHead1.next; pHead2=pHead2.next; } } return null; } public int getlen(ListNode head){ int count=
0; while(head!=null){ count++; head=head.next; } return count; } public static void main(String[] args) { ListNode node1=new ListNode(1); ListNode node2=new ListNode(2); ListNode node3=new ListNode(3); ListNode node4=new ListNode(4); ListNode node5=new ListNode(5); ListNode node6=new ListNode(6); ListNode node7=new ListNode(7); node1.next=node2; node2.next=node3; node3.next=node6; node4.next=node5; node5.next=node6; node6.next=node7; ListNode node=new Solution36().FindFirstCommonNode(node1,node4); if(node==null){ BeanUtil.print("null"); }else{ BeanUtil.print(node.val); } } }

再說一個leetcode上的方法

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

程式碼分析

長度相同有公共結點,第一次就遍歷到;沒有公共結點,走到尾部NULL相遇,返回NULL
長度不同有公共結點,第一遍差值就出來了,第二遍一起到公共結點;沒有公共,一起到結尾NULL。

最壞的情況就是沒有相同點:
p1先遍歷pHead1,在遍歷pHead2,直到最後為null。
p2先遍歷pHead2,在遍歷pHead1,直到最後為null。
最後,兩者為null相遇。

在這裡插入圖片描述