判斷兩個單向鍊錶是否相交,有兩種情況,一種是兩個不帶環的單向鍊錶相交,一種是兩個帶環的單向鍊錶相交。
情況1:兩個不帶環的單向鍊錶相交
/*判斷兩個不帶環的單向鍊錶是否相交。時間複雜度o(n),空間複雜度o(1)*/
/*思路:如果兩個沒有環的鍊錶相交於某一節點,那麼在這個節點之後的*/
/*所有節點都是兩個鍊錶共有的,如果它們相交,則最後乙個節點一定是共有的*/
int is_intersect(struct list_head *head_one, struct list_head *head_two)
return 0;/*相交*/
}
情況2:兩個帶環的單向鍊錶相交
/*判斷兩個帶環的單向鍊錶是否相交*/
/*思路:如果有環且兩個鍊錶相交,則兩個鍊錶都有共同乙個環,即環上的任意乙個節點都存在*/
/*於兩個鍊錶上。因此,就可以判斷一煉表上倆指標相遇的那個節點,在不在另一條鍊錶上。*/
int is_intersect(struct list_head *head_one, struct list_head *head_two)
}if (slow != fast)/*鍊錶1沒有環*/
return -1;
/*判斷鍊錶2有沒有環*/
slow = head_two;
fast = head_two;
while (fast != null && fast->next != null)
if (slow != fast)/*鍊錶2沒有環*/
return -1;
/*這裡的slow、fast都為鍊錶2的環內節點,現在遍歷這個環,看鍊錶1的環內節點temp在不在這個環上*/
slow = slow->next;
while (slow != fast)
return 0;/*不相交*/
}
擴充套件:兩鍊錶相交的第乙個公共節點
題目描述:如果兩個無環單鏈表相交,怎麼求出他們相交的第乙個節點呢?
分析:採用對齊的思想。先計算兩個鍊錶的長度 l1 , l2,分別用兩個指標 p1 , p2 指向兩個鍊錶的頭,然後將較長鍊錶的 p1(假設為 p1)向後移動l2 - l1個節點,然後再同時向後移動p1 , p2,直到p1 = p2。相遇的點就是相交的第乙個節點。
參考博文:
判斷兩個單向鍊錶是否相交
鍊錶分為有環和無環,如果兩個鍊錶存在相交,則只有兩種可能,兩個鍊錶都無環或者都有環。下面分別討論。2.1定義鍊錶 單向鍊錶 public static class linknode 2.2判斷是否有環 判斷是否有環,有環返回入口點,無環返回null。public static linknode is...
判斷兩個單向鍊錶是否相交
給定兩個 單向 鍊錶,判定它們是否相交並返回交點。請注意相交的定義基於節點的引用,而不是基於節點的值。換句話說,如果乙個鍊錶的第k個節點與另乙個鍊錶的第j個節點是同一節點 引用完全相同 則這兩個鍊錶相交。首先最容易想到暴力搜尋,對a鏈的每乙個節點,都對b鍊錶進行遍歷搜尋看是否相同 public li...
判斷兩個鍊錶是否相交
思路1 最暴力的辦法,針對鍊錶1的每乙個節點,判斷其是否也在鍊錶2中,複雜度o n m 明顯不是乙個好方法。思路2 給每個節點增加乙個標記量,可以是附在鍊錶中的成員,也可以是另外的乙個結構,例如用乙個陣列來儲存。先遍歷鍊錶1,標記出遍歷過的節點,再遍歷鍊錶2,如果發現某個節點已經被遍歷過,則說明相交...