**
已知鍊錶a的頭節點指標heada,鍊錶b的頭節點指標headb。
兩個鍊錶相交,求兩鍊錶交點對應的節點
如果兩個鍊錶沒有交點,則返回null;
在求交點的過程中,不可以破壞鍊錶的結構或者修改鍊錶的資料域;
可以確保傳入的鍊錶a與鍊錶b沒有任何環;
實現演算法盡可能時間複雜度o(n),空間複雜度o(1)
#include
#include
using
namespace std;
struct listnode
//建構函式};
/*// 方法一。runtime: 76 ms, memory usage: 20.1 mb。時間複雜度為o(nlogn),空間複雜度為o(n)
class solution
~solution(){}
listnode* getintersectionnode(listnode* heada, listnode* headb)
while (headb)
headb = headb->next;
} return null;
}};*///方法二。runtime: 52 ms, memory usage: 16.8 mb。
intget_list_length
(listnode* head)
return len;
}listnode*
forward_long_list
(int long_len,
int short_len, listnode* head)
return head;
}class
solution
~solution()
listnode*
getintersectionnode
(listnode* heada, listnode* headb)
else
while
(heada&&headb)
heada = heada-
>next;
headb = headb-
>next;
}return
null;}
};intmain()
執行結果為:6**
輸入兩個鍊錶,找出它們的第乙個公共節點
# -*- coding:utf-8 -*-
class
listnode
:def
__init__
(self, x)
: self.val = x
self.
next
=none
class
solution
:def
findfirstcommonnode
(self, phead1, phead2)
:def
findequal
(shortpointer, longpointer, shorthead, longhead)
: k =
0while longpointer:
longpointer = longpointer.
next
k +=
1 shortpointer = shorthead
longpointer = longhead
for i in
range
(k):
longpointer = longpointer.
next
while shortpointer != longpointer:
shortpointer = shortpointer.
next
longpointer = longpointer.
next
return shortpointer
ptmp1 = phead1
ptmp2 = phead2
while ptmp1 and ptmp2:
# 當兩個鍊錶的長度相同時
if ptmp1 == ptmp2:
return ptmp2
ptmp1 = ptmp1.
next
ptmp2 = ptmp2.
next
if ptmp1:
return findequal(ptmp2, ptmp1, phead2, phead1)
if ptmp2:
return findequal(ptmp1, ptmp2, phead1, phead2)
if __name__ ==
'__main__'
: a1 = listnode(1)
a2 = listnode(2)
b1 = listnode(3)
b2 = listnode(4)
b3 = listnode(5)
c1 = listnode(6)
c2 = listnode(7)
c3 = listnode(8)
a1.next
= a2
a2.next
= c1
c1.next
= c2
c2.next
= c3
b1.next
= b2
b2.next
= b3
b3.next
= c1
s = solution(
)print
(s.findfirstcommonnode(a1, b1)
.val)
執行結果為:
6
求兩個單向鍊錶的交點
題目 給出兩個單向鍊錶,判斷其是否有交點 如果存在交點,請找出交點 解題思路 如果存在交點,則兩個鍊錶的節點結構必定是同構的 如果存在交點,則兩個鍊錶必定程式y字形,而不可能是x形 如果存在交點,兩個鍊錶在交點及其之後的部分是一致的 這點很關鍵,一致的意思包括兩部分 長度和內容。基於以上三點,可以給...
求兩個交叉鍊錶的交點
如果兩個鍊錶相交,又都不存在環,那麼從第乙個相交點開始之後的結點都相同 構成了乙個y型 因此,只要分別遍歷這兩個鍊錶,找到末尾結點,如果末尾結點相同,即可確認相交。如果要求這種情況的交點,由於相交部分全部都相同,所以彼此的長度差異存在於相交之前的部分。因此,只需要先得到兩個鍊錶的差d,然後將較長的鍊...
C 求兩個鍊錶的交點
int main int b lenb for int i 0 i lena i for int i 0 i lenb i return0 結果 b 3 3 in array a.b 4 1 in array a.b 7 1 in array a.演算法寫在乙個類裡 class solution w...