判斷兩個連結串列是否交叉,並求出交叉點
有兩個單向連結串列,表頭pHeader1,pHeader2,請寫一個函式判斷這兩個連結串列是否有交叉.如果有交叉,給出交叉點.程式不能改變連結串列的內容,可以使用額外的空間,時間複雜度儘量小,最好給出兩種解.(雙重迴圈的解由於時間複雜度高,不算正解).
基本思想:如果兩個連結串列交叉,那麼這兩個連結串列在交叉點之後的節點是完全相同的!!
因此可以用一下的演算法判斷兩個連結串列是否交叉
1. 分別得到兩個連結串列的最後一個節點,以及連結串列的長度.
2. 如果2個連結串列的最後一個節點地址相同,則有交叉,否則執行3
3. 假設兩個連結串列的長度分別是m和n,且m>=n,那麼移動長的那個連結串列,先移動m-n個節點,是長連結串列與短連結串列在末端對齊,然後從對其的節點開始比較兩個連結串列,如果不相等,就都向後移動一格.(注意這裡是兩個連結串列的指標同時向後移動)直到相等,相等的節點就是交叉點.
4. 時間複雜度O(n+m).
相關推薦
判斷兩個連結串列是否交叉,並求出交叉點
有兩個單向連結串列,表頭pHeader1,pHeader2,請寫一個函式判斷這兩個連結串列是否有交叉.如果有交叉,給出交叉點.程式不能改變連結串列的內容,可以使用額外的空間,時間複雜度儘量小,最好給出兩種解.(雙重迴圈的解由於時間複雜度高,不算正解). 基本思想:如果兩個
判斷兩個連結串列是否相交,若相交,求交點。(假設連結串列不帶環)
判斷是否相交 int IsCrossWithoutCircle(pList plist1, pList plist2) { pNode pTail1 = plist1; pNode pTail2 = plist2; if (pTail1 == NULL || pTai
java實現---判斷兩個連結串列是否相交,若相交,求交點(假設連結串列不帶環)
有兩個單鏈表,判斷它們是否相交,若相交,求交點 第一步判斷兩個連結串列是否相交 第二步求交點 第一步判斷兩個連結串列是否相交 如果兩個連結串列相交,那麼它們的
判斷兩個連結串列是否相交,若相交,求交點。(連結串列可能帶環)
int IsListCrossWithCircle(pList plist1, pList plist2) { pNode pMeetNode1 = NULL, pMeetNode2 = NULL; //杜絕空連結串列的存在 if (NULL == plist1 &
判斷單鏈表是否存在環,判斷兩個連結串列是否相交問題詳解
有一個單鏈表,其中可能有一個環,也就是某個節點的next指向的是連結串列中在它之前的節點,這樣在連結串列的尾部形成一環。問題:1、如何判斷一個連結串列是不是這類連結串列?2、如果連結串列為存在環,如何找到環的入口點?解答:一、判斷連結串列是否存在環,辦法為:設定兩個指標(fast, slow),初始值都指向頭
如果連結串列可能有環,判斷兩個連結串列是否相交?
題目來源:程式設計之美 《3.6 程式設計判斷兩個連結串列是否相交?》的擴充套件問題。 上網查找了寫資料現做個總結。 可以分兩步:(1)判斷兩個連結串列是否有環?若有環,入口點是什麼? (2)判斷是否相交? 第一個問題的典型解法為設定兩個指標p1和p2,p1每次走一步,
【三次過】Lintcode 380. 兩個連結串列的交叉
請寫一個程式,找到兩個單鏈表最開始的交叉節點。 樣例 下列兩個連結串列: A: a1 → a2 ↘ c1 → c2 → c3 ↗
帶頭結點的兩個連結串列La,Lb,將兩個連結串列合併到La中,並且不破壞Lb的結構
#include<stdio.h>#include<malloc.h> typedef struct LNode{ int data; struct LNode *next;}LNode,*LinkList; void CreateList(LinkList &L,int
【資料結構】連結串列相關練習題:判斷兩個連結串列是否相交
編寫一個程式,找到兩個單鏈表相交的起始節點。 例如,下面的兩個連結串列: A: a1 → a2 ↘ c1 → c2 → c3 ↗
怎麼判斷兩個連結串列是否有merge?如果有:在哪?
Abstact 刷OJ時,遇到一個題:判斷兩個連結串列是否有merge?如果有?在哪?如下圖:merge point在值為3的地方。 在StackOverflow上一個回答特別棒:check if two linked lists merge 現在記錄下來。 Algorithm
判斷2個連結串列是否相交,如果相交,求出交點
如果2個連結串列相交,一定有相同的尾結點 思路:分別遍歷找到尾結點,比較,若相同則相交,否則不相交。如果相交,求出交點 public class XiangJiao { public static void main(String[] args){
面試12之給定兩個連結串列ListNode* A,ListNode* B,請返回A+B的結果
有兩個用連結串列表示的整數,每個結點包含一個數位。這些數位是反向存放的,也就是個位排在連結串列的首部。編寫函式對這兩個整數求和,並用連結串列形式返回結果。給定兩個連結串列ListNode* A,ListNode* B,請返回A+B的結果(ListNode*)。測試樣例:{
程式設計之美3.6——程式設計判斷兩個連結串列是否相交
問題: 給出兩個單向連結串列的頭指標,而兩個連結串列都可能帶環,判斷這兩個連結串列是否相交,並且給出他們相交的第一個節點。 (1)判斷連結串列是否存在環 設定兩個連結串列指標(fast, slow),初始值都指向連結串列頭結點,然後連個指標都往前走,不同的是s
Java程式碼 判斷兩個連結串列是否相交
題目:判斷兩個單向連結串列是否相交,假設兩個連結串列均不存在環 演算法思路:有兩種方法,第一種方法就是在其中一個連結串列上順序遍歷每個節點,每遍歷一個節點的時候,在另外一個連結串列上順序遍歷每個節點,如果便利過程中發現兩個節點相同,說明此時連結串列相交,也就找到了他們的第一
3.6 程式設計判斷兩個連結串列是否相交
(一)題目:輸入一個單項鍊表,找出該連結串列的倒數第k個節點。 解法:設立兩個指標,先讓第一個指標先往前走k步,然後第二個指標放到連結串列開頭。 然後兩個連結串列一起往後走,當第一個連結串列到達連結串列尾部的時候,後面那個連結串列所在的位置就剛好是連結串列
《程式設計之美》——程式設計判斷兩個連結串列是否相交
問題: 給出兩個連結串列的頭指標,判斷這兩個連結串列是否相交。假設兩個連結串列均不帶環。 分析與解法: 【解法一】 如果兩個連結串列都無環,則可以把第二個連結串列接在第一個連結串列後面,如果
查詢兩個連結串列的交叉節點
1. 問題描述 給定兩個單鏈表,查詢這兩個單鏈表的交叉節點。例如:連結串列listA為:a1→a2→c1→c2→c3,連結串列listB為:b1→b2→b3→c1→c2→c3。那麼這兩個的第一個交叉節點為c1。 2. 方法與思路 首先,觀察一下
[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
定義一個帶參的巨集,使兩個引數的值互換,並寫出程式,輸入兩個數作為使用巨集時的實參。輸出已交換後的兩個值。
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanne
判斷連結串列是否有環並求出環的起點
判斷連結串列有無環的方法: 設定一個快指標速度 != 慢指標的速度,這就是物理裡的相遇問題,我開始犯了一個錯,我設定快指標和慢指標的速度相等,所以答案出錯,原因是速度相等,那麼它們在座標軸上的速度永