如何判斷連個單鏈表(無環)是否交叉

2021-09-09 07:43:53 字數 1834 閱讀 1937

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步。如存在環,則兩者相遇 如不存在...