《劍指office》兩個鏈表的第一個公共結點



題目描述

輸入兩個鏈表,找出它們的第一個公共結點。
鏈表的定義如下:
/*
public class ListNode {
    int val;
    ListNode next = null;
    ListNode(int val) {
        this.val = val;
    }
}*/
 看到這道題的時候很多的第一反應就是採用蠻力的方法:在第一個鏈表上順序遍歷每個節點,每遍歷到一個節點的時候,在第二個鏈表上順序遍歷每個節點。如果第二個鏈表上的節點和第一個鏈表上的節點一樣,就說明兩個鏈表在節點上重合,於是就找到了公共的節點。但是這種方法的時間複雜度是非常高的,所以說不是什麼明智的方法。
略加思索,我就準備用壓棧的方法。建立一個棧,判斷鏈表元素在棧中是否存在,存在就返回節點,不存在就壓入棧中,如此循環,直到兩個鏈表都爲空。
代碼:
/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
import java.util.*;
public class Solution {
    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
        //建立棧
        Stack<Integer> stack = new Stack<Integer>();
        //同時對兩個鏈表開始循環,鏈表元素在棧中存在就返回節點,不存在就把鏈表元素壓棧
        while((pHead1 !=null) &&(pHead2 != null)){
            if(-1 ==stack.search(pHead1.val)){
                stack.push(pHead1.val);
                pHead1 = pHead1.next;
            }else{
                return pHead1;
            }
            if(-1 ==stack.search(pHead2.val)){
                stack.push(pHead2.val);
                pHead2 = pHead2.next;
            }else{
                return pHead2;
            }
        }
        //鏈表1未遍歷完的情況
        while(pHead1 !=null){
            if(-1 ==stack.search(pHead1.val)){
                stack.push(pHead1.val);
                pHead1 = pHead1.next;
            }else{
                return pHead1;
            }
        }
        //鏈表2未遍歷完的情況
        while(pHead2 !=null){
            if(-1 ==stack.search(pHead2.val)){
                stack.push(pHead2.val);
                pHead2 = pHead2.next;
            }else{
                return pHead2;
            }
        }
        return null;
    }
}

發佈了37 篇原創文章 · 獲贊 80 · 訪問量 4004
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章