1. 程式人生 > >Java程式碼 判斷兩個連結串列是否相交

Java程式碼 判斷兩個連結串列是否相交

題目:判斷兩個單向連結串列是否相交,假設兩個連結串列均不存在環

演算法思路:有兩種方法,第一種方法就是在其中一個連結串列上順序遍歷每個節點,每遍歷一個節點的時候,在另外一個連結串列上順序遍歷每個節點,如果便利過程中發現兩個節點相同,說明此時連結串列相交,也就找到了他們的第一個公共節點,這個演算法的時間複雜度是O(mn),比較耗時

第二種方法是比較簡單一點的方法:首先依次遍歷倆個連結串列的節點,求出兩個連結串列的長度,算出兩個連結串列的長度差,然後先在長的連結串列上遍歷長度差個節點,之後在同步遍歷,第一個相同的節點就是公共節點,這種方法的時間複雜度是O(m+n)

具體程式碼如下:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if(headA==null||headB==null){
            return null;
        }
        ListNode p=headA;
        ListNode q=headB;
        int length1=0;
        int length2=0;
        int diff=0;
        while(p!=null){
            length1++;
            p=p.next;
        }
        while(q!=null){
            length2++;
            q=q.next;
        }
        if(length1>length2){
            p=headA;
            q=headB;
            diff=length1-length2;
        }
        else{
            p=headB;
            q=headA;
            diff=length2-length1;
        }
        for(int i=0;i<diff;i++){
            p=p.next;
        }
        while(p!=null&&q!=null){
            if(p.val==q.val){
                return p;
            }
            p=p.next;
            q=q.next;
        }
        return null;
    }
    
}

相關推薦

Java程式碼 判斷連結串列是否相交

題目:判斷兩個單向連結串列是否相交,假設兩個連結串列均不存在環 演算法思路:有兩種方法,第一種方法就是在其中一個連結串列上順序遍歷每個節點,每遍歷一個節點的時候,在另外一個連結串列上順序遍歷每個節點,如果便利過程中發現兩個節點相同,說明此時連結串列相交,也就找到了他們的第一

java實現---判斷連結串列是否相交,若相交,求交點(假設連結串列不帶環)

有兩個單鏈表,判斷它們是否相交,若相交,求交點 第一步判斷兩個連結串列是否相交 第二步求交點 第一步判斷兩個連結串列是否相交 如果兩個連結串列相交,那麼它們的

判斷連結串列是否相交,若相交,求交點。(假設連結串列不帶環)

判斷是否相交 int IsCrossWithoutCircle(pList plist1, pList plist2) { pNode pTail1 = plist1; pNode pTail2 = plist2; if (pTail1 == NULL || pTai

【資料結構】連結串列相關練習題:判斷連結串列是否相交

編寫一個程式,找到兩個單鏈表相交的起始節點。 例如,下面的兩個連結串列: A: a1 → a2 ↘ c1 → c2 → c3 ↗

判斷單鏈表是否存在環,判斷連結串列是否相交問題詳解

有一個單鏈表,其中可能有一個環,也就是某個節點的next指向的是連結串列中在它之前的節點,這樣在連結串列的尾部形成一環。問題:1、如何判斷一個連結串列是不是這類連結串列?2、如果連結串列為存在環,如何找到環的入口點?解答:一、判斷連結串列是否存在環,辦法為:設定兩個指標(fast, slow),初始值都指向頭

程式設計之美3.6——程式設計判斷連結串列是否相交

問題: 給出兩個單向連結串列的頭指標,而兩個連結串列都可能帶環,判斷這兩個連結串列是否相交,並且給出他們相交的第一個節點。 (1)判斷連結串列是否存在環 設定兩個連結串列指標(fast, slow),初始值都指向連結串列頭結點,然後連個指標都往前走,不同的是s

3.6 程式設計判斷連結串列是否相交

(一)題目:輸入一個單項鍊表,找出該連結串列的倒數第k個節點。    解法:設立兩個指標,先讓第一個指標先往前走k步,然後第二個指標放到連結串列開頭。       然後兩個連結串列一起往後走,當第一個連結串列到達連結串列尾部的時候,後面那個連結串列所在的位置就剛好是連結串列

判斷連結串列是否相交,若相交,求交點。(連結串列可能帶環)

int IsListCrossWithCircle(pList plist1, pList plist2) { pNode pMeetNode1 = NULL, pMeetNode2 = NULL; //杜絕空連結串列的存在 if (NULL == plist1 &

《程式設計之美》——程式設計判斷連結串列是否相交

問題: 給出兩個連結串列的頭指標,判斷這兩個連結串列是否相交。假設兩個連結串列均不帶環。 分析與解法: 【解法一】 如果兩個連結串列都無環,則可以把第二個連結串列接在第一個連結串列後面,如果

如果連結串列可能有環,判斷連結串列是否相交

題目來源:程式設計之美 《3.6 程式設計判斷兩個連結串列是否相交?》的擴充套件問題。 上網查找了寫資料現做個總結。 可以分兩步:(1)判斷兩個連結串列是否有環?若有環,入口點是什麼? (2)判斷是否相交? 第一個問題的典型解法為設定兩個指標p1和p2,p1每次走一步,

怎麼判斷連結串列是否有merge?如果有:在哪?

Abstact 刷OJ時,遇到一個題:判斷兩個連結串列是否有merge?如果有?在哪?如下圖:merge point在值為3的地方。 在StackOverflow上一個回答特別棒:check if two linked lists merge 現在記錄下來。 Algorithm

[LeetCode] 判斷連結串列是否有公共節點並返回第一公共節點

Write a program to find the node at which the intersection of two singly linked lists begins. For example, the following two linked lis

判斷連結串列是否交叉,並求出交叉點

有兩個單向連結串列,表頭pHeader1,pHeader2,請寫一個函式判斷這兩個連結串列是否有交叉.如果有交叉,給出交叉點.程式不能改變連結串列的內容,可以使用額外的空間,時間複雜度儘量小,最好給出兩種解.(雙重迴圈的解由於時間複雜度高,不算正解). 基本思想:如果兩個

連結串列是否相交

判斷單鏈表中是否有環,找到環的入口節點:在MeetingNode方法中,當快慢指標(slow、fast)相遇時,slow指標肯定沒有遍歷完連結串列,而fast指標已經在環內迴圈了n(n>=1)圈。假設slow指標走了s步,則fast指標走了2s步。同時,fast指標

判斷2連結串列是否相交,如果相交,求出交點

如果2個連結串列相交,一定有相同的尾結點 思路:分別遍歷找到尾結點,比較,若相同則相交,否則不相交。如果相交,求出交點 public class XiangJiao { public static void main(String[] args){

《劍指offer》系列 連結串列的第一公共結點(Java

連結 牛客:兩個連結串列的第一個公共結點 題目描述 輸入兩個連結串列,找出它們的第一個公共結點。 思路 倆個連結串列存在公共結點,意味著第一個公共結點之後的都是相同的,就是說,兩個連結串列的尾巴是相同的,我們可以分別算出兩個連結串列的長度之差lenDif ,然後遍歷長

Java連結串列數字相加

給出兩個 非空 的連結串列用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。 如果,我們將這兩個數相加起來,則會返回一個新的連結串列來表示它們的和。 您可以假設除了數字 0 之外,這兩

判斷單鏈表是否相交,若相交,求節點(連結串列不帶環)

先理解一下題目的意思,單鏈表的相交和普通兩條線的相交一樣嗎? 所以當我們把其換成節點就可以變成下面這樣: 先判斷連結串列是否相交,我們可以運用兩個連結串列相交後就變成了一條連結串列這個特性來判斷,因為如果兩條連結串列相交,那麼這兩條連結串列的最後一個節點一定

劍指offer之連結串列的第一公共點(Java實現)

兩個連結串列的第一個公共點 輸入兩個連結串列,找出它們的第一個公共結點 思路:我們先遍歷找到兩個連結串列的長度m和n, 如果m大,m比n大多少,比如說k,那麼先讓m先走k步,然後n和m再一起走。

#資料結構與演算法學習筆記#劍指Offer34:連結串列的第一公共結點 + 等長遍歷/輔助棧 + 測試用例(Java、C/C++)

2018.10.21 這道題也是屬於效率題,實現難度不大,但是要降低複雜度還是需要思考一下。有兩個o(n)的做法: 方法一:等長連結串列法。先計算兩條連結串列的長度,然後先遍歷長連結串列直到兩條連結串列等長,最後依次按奇偶順序挨個遍歷兩條連結串列各個結點。 方法二:輔助