1. 程式人生 > >面試題52:兩個連結串列的第一個公共節點

面試題52:兩個連結串列的第一個公共節點

/*

 * 面試題52:兩個連結串列的第一個公共節點

 * 題目:輸入兩個連結串列,找出它們的第一個公共結點

 * 思路:首先遍歷兩個連結串列得到它們的長度,比較長短。

 * 第二遍,在較長的連結串列上先走若干步,接著同時在兩個連結串列上遍歷

 * 找到的第一個相同的節點就是它們的第一個公共節點

 */

class ListNode6 {

    int val;

    ListNode6 next = null;

    ListNode6(int val) {

       this.val = val;

    }

}

public class No52FindFirstCommonNode {

    public static void main(String[] args) {

       No52FindFirstCommonNode n = new No52FindFirstCommonNode();

       ListNode6 p1 = new ListNode6(1);

       ListNode6 p2 = new ListNode6(2);

       ListNode6 p3 = new ListNode6(3);

       ListNode6 p4 = new ListNode6(4);

       ListNode6 p5

= new ListNode6(5);

       ListNode6 p6 = new ListNode6(6);

       ListNode6 p7 = new ListNode6(7);

       p1.next = p2;

       p2.next = p3;

       p3.next = p6;

       p6.next = p7;

       p4.next = p5;

       p5.next = p6;

       System.out.print(n.FindFirstCommonNode(p1, p4).val);

    }

    public ListNode6 FindFirstCommonNode(ListNode6 pHead1, ListNode6 pHead2) {

       ListNode6 p1 = pHead1;

       ListNode6 p2 = pHead2;

       int size1 = 0;

       int size2 = 0;

       //遍歷出連結串列1的長度

       while(p1 != null) {

           size1++;

           p1 = p1.next;

       }

       //遍歷出連結串列2的長度

       while(p2 != null) {

           size2++;

           p2 = p2.next;

       }

       p1 = pHead1;

       p2 = pHead2;

       //連結串列2長,先走

       if(size1 < size2) {

           int p = size2 - size1 - 1;

           while (p >= 0) {

              p2 = p2.next;

              p--;

           }

       } else {//連結串列1長,先走

           int p = size1 - size2 - 1;

           while (p >= 0) {

              p1 = p1.next;

              p--;

           }

       }

       //同時遍歷,直到遇到第一個相同的節點

       while (p1 != p2 && p1 != null && p2 != null) {

           p1 = p1.next;

           p2 = p2.next;

       }

       return p1;

    }

}