1.鏈表定義
鏈式存儲結構存儲線性表的方法是把存放數據元素的結點用指針域構造成鏈。指針是指向下一個節點的引用,由數據元素域和一個或若干個指針域組
成的一個類稱之為結點。鏈式存儲結構的特點是數據元素間的邏輯關系表現在節點的鏈接關系上。
2.相交的理解
若兩個鏈表相交
則其相交后的結點必定是最后一個結點或者是第k個結點能使其后面的結點連結成一條直線的結點
則可以得出若兩個單向鏈表相交,則兩個鏈表組成的形狀一定為V型或Y型。
3.解決方法
可以考慮用三種方式來實現:
(1)使用雙重循環來遍歷結點判斷是否相同
(2)判斷兩個鏈表的最后一個結點是否相同
(3)將兩個鏈表構成環
設定鏈表結點的數據結構為
Node{
DataType data; //數據元素域
Node next; //指針域
}
第一個結點的引用為root;
3.1 雙重循環判斷
對兩個單向鏈表進行循環,臨界值:當第一個鏈表的結點與第二個鏈表的結點相同時返回true,反之返回false。
/**
* 使用while進行循環迭代,條件為next不為null
*/
while root1 != null
begin
while root2 != null
begin
if root1 == root2 then do return true
end if
end
end
return false
時間復雜度分析: 最好的情況下是root1==root2,此時只循環一次,時間復雜度為O(1),最壞情況下是兩個鏈表的最后
一個結點相等時,循環需要n*n次,即時間復雜度為O(n2).
3.2 判斷最后一個結點是否相同
得到兩個單向鏈表的最后一個結點,臨界值:兩個結點相同時返回true,反之返回false
/**
* 用root1指代第一個鏈表的頭結點,root2指代第二個鏈表的頭結點
*/
while root1 != null
begin
root1 = root1.next
end
while root2 != null
begin
root2 = root2.next
end
if root1 == root2 then return true
else
return false
end if
時間復雜度分析: 該算法的時間復雜度在最好和最壞的情況下都是O(n),都必須循環n次到尾結點。
3.3 鏈表成環
假設兩個鏈表尾部相連能夠構成環,則一個鏈表的首結點遍歷到末尾結點必然是另一個鏈表的首結點。
/**
* 該程序的先覺條件是必須在兩個鏈表已經構成環的基礎上可執行
*/
while root1 != null
begin
root1 = root1.next
end
if root1 == root2 then return true
return false
時間復雜度分析: 該算法的時間復雜度在最好和最壞的情況下都是O(n),都必須循環n次到尾結點。