如果兩個單鏈表相交,輸出相交節點

如果兩個單鏈表相交,輸出相交節點

一、實現

package com.mtons.mblog.leetcode;

/**
 * 如果兩個單鏈表相交,輸出相交節點
 *
 * 讓 兩個鏈表先處於同一起跑線,如圖所示,然後再  同時向後遍歷(從d和h開始同時向後遍歷),那
 * 麼就可以確定是在哪個地方相交的了(確定了在f處相同,即交點)。
 *
 * 那麼如何讓他倆處於同一起跑線呢?
 *
 * 很簡單,只需要長的鏈表先走    走到與短的鏈表一樣長就可以了。
 *
 * 所以解法:
 *
 * 1,分別計算兩個鏈表的長度,得出差值(長的爲7,短的爲4,差值3)
 *
 * 2,讓長的鏈表先走   (差值)  步,此時兩個鏈表長度相同(長的從d開始,短的從h開始)
 *
 * 3,同時遍歷兩個鏈表,當相同時,即找到了交點。(遍歷到f時相等,即交點)
 *  
 *
 * 這裏的相交不是指值一樣,而是指佔用同一片內存空間,完全是一樣的。這點在解題的時候至關重要!!!!
 * 一旦找到了一個這樣的節點,那麼之後兩個鏈表的節點對應着也就佔用相同的內存空間,就無需判斷了。這是
 * 因爲由鏈表的性質決定的,node.next只有一個。
 */
public class NodeSame {

    static class Node{
        int data;
        Node next;

        public Node(int data,Node next){
            this.data = data;
            this.next = next;
        }
    }

    public static void main(String[] args) {


        //1->2->3->4->5
        Node node5 = new Node(5,null);
        Node node4 = new Node(4,node5);
        Node node3 = new Node(3,node4);
        Node node2 = new Node(2,node3);
        Node node1 = new Node(1,node2);


        //設置相交的Node節點是node4 即:6->4->5
        Node node6 = new Node(6,node4);

        Node result = getSameNode(node1,node6);
        System.out.println(result.data);


    }

    public static Node getSameNode(Node head1,Node head2){

        if(head1 == null || head2 == null){
            return null;
        }

        Node head1Temp = head1;
        Node head2Temp = head2;

        int head1Len = 0;
        int head2Len = 0;

        while (head1Temp != null){
            head1Len++;
            head1Temp = head1Temp.next;
        }

        while (head2Temp != null){
            head2Len++;
            head2Temp = head2Temp.next;
        }

        head1Temp = head1;
        head2Temp = head2;

        Node result = null;

        while (head1Len > head2Len){
            head1Temp = head1Temp.next;
            head1Len--;
        }

        while (head1Len < head2Len){
            head2Temp = head2Temp.next;
            head2Len--;
        }

        while (true){

            if(head1Temp == head2Temp){
                result = head1Temp;
                break;
            }

            //如果沒有相交 那麼直接跳出循環
            if(head1Temp == null || head2Temp == null){
                break;
            }

            head1Temp = head1Temp.next;
            head2Temp = head2Temp.next;
        }

        return result;
    }
}

二、輸出

4
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章