class lnode:
def __init__(self):
self.data = none
self.next = none
def isintersect(head1, head2):
"""方法功能:判斷兩個鍊錶是否相交,如果相交找出交點
:param head1: 第乙個鍊錶
:param head2: 第二個鍊錶
:return: 如果不相交返回none, 如果相交返回相交結點
"""if head1 is none or head1.next is none or head2 is none or head2.next is none or head1 == head2:
return none
temp1 = head1.next
temp2 = head2.next
n1, n2 = 0, 0
# 遍歷head1,找到尾結點,同時記錄head1的長度
while temp1.next is not none:
temp1 = temp1.next
n1 += 1
# 遍歷head2,找到尾結點,同時記錄head2的長度
while temp2.next is not none:
temp2 = temp2.next
n2 += 1
if temp1 == temp2:
# 長鍊表線走|n1-n2|步
if n1 > n2:
while n1 - n2 > 0:
head1 = head1.next
n1 -= 1
if n2 > n1:
while n2 - n1 >0:
head2 = head2.next
n2 -= 1
# 兩個鍊錶同時前進,找出相同的結點
while head1 != head2:
head1 = head1.next
head2 = head2.next
return head1
# head1 與head2 是沒有相同的尾結點
else:
return none
if __name__ == '__main__':
i = 1
# 煉表頭結點
head1 = lnode()
head2 = lnode()
tmp = none
cur = head1
p = none
# 構造第乙個鍊錶
while i < 8:
tmp = lnode()
tmp.data = i
cur.next = tmp
cur = tmp
if i == 5:
p = tmp
i += 1
cur = head2
# 構造第二個鍊錶
i = 1
while i < 5:
tmp = lnode()
tmp.data = i
cur.next = tmp
cur = tmp
i += 1
# 是它們相交於點5
cur.next = p
internode = isintersect(head1, head2)
if internode is none:
print('這兩個鍊錶不相交')
else:
print('這兩個鍊錶相交點:' + str(internode.data))
執行結果如下:
這兩個鍊錶相交點:5
如何判斷單鏈表是否出現環
如何判斷鍊錶中有無環 單向鍊錶中有環的話,如果我們對此鍊錶進行遍歷,則將無窮盡。因此有必要判斷乙個單向鍊錶是否有環。假如乙個單向鍊錶中存在環,如下圖 乙個小矩形代表鍊錶中的乙個節點 虛線箭頭代表中間有無數節點。先說演算法,然後再來證明演算法的正確性。以下演算法可以判斷乙個單向鍊錶中是否有環 不討論詳...
如何判斷單鏈表是否存在環
給定乙個單鏈表,只給出頭指標h 1 如何判斷是否存在環?2 如何知道環的長度?3 如何找出環的連線點在 4 帶環鍊錶的長度是多少?解法 1 對於問題1,使用追趕的方法,設定兩個指標slow fast,從頭指標開始,每次分別前進1步 2步。如存在環,則兩者相遇 如不存在環,fast遇到null退出。2...
如何判斷單鏈表是否存在環
原文 如何判斷單鏈表是否存在環 給定乙個單鏈表,只給出頭指標h 1 如何判斷是否存在環?2 如何知道環的長度?3 如何找出環的連線點在 4 帶環鍊錶的長度是多少?解法 1 對於問題1,使用追趕的方法,設定兩個指標slow fast,從頭指標開始,每次分別前進1步 2步。如存在環,則兩者相遇 如不存在...