題目描述:
編寫一個程序漾唉,找到兩個單鏈表相交的起始節(jié)點。
如下面的兩個鏈表:
在節(jié)點 c1 開始相交饿悬。
示例 1:
輸入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
輸出:Reference of the node with value = 8
輸入解釋:相交節(jié)點的值為 8 (注意久又,如果兩個列表相交則不能為 0)舷暮。從各自的表頭開始算起煞茫,鏈表 A 為 [4,1,8,4,5]帕涌,鏈表 B 為 [5,0,1,8,4,5]。在 A 中续徽,相交節(jié)點前有 2 個節(jié)點蚓曼;在 B 中,相交節(jié)點前有 3 個節(jié)點钦扭。
示例 2:
輸入:intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
輸出:Reference of the node with value = 2
輸入解釋:相交節(jié)點的值為 2 (注意纫版,如果兩個列表相交則不能為 0)。從各自的表頭開始算起土全,鏈表 A 為 [0,9,1,2,4]捎琐,鏈表 B 為 [3,2,4]。在 A 中裹匙,相交節(jié)點前有 3 個節(jié)點;在 B 中末秃,相交節(jié)點前有 1 個節(jié)點概页。
示例 3:
輸入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
輸出:null
輸入解釋:從各自的表頭開始算起,鏈表 A 為 [2,6,4]练慕,鏈表 B 為 [1,5]惰匙。由于這兩個鏈表不相交技掏,所以 intersectVal 必須為 0,而 skipA 和 skipB 可以是任意值项鬼。
解釋:這兩個鏈表不相交哑梳,因此返回 null。
題目分析:
因為兩個list是后面相同绘盟,所以如果兩個長度不同鸠真,則可以將長的那個突出的那幾個節(jié)點不比較,直接讓后面的節(jié)點與短的list節(jié)點比較龄毡,具體可以看最上面的示例圖吠卷,就相當于我們讓a1與b2開始比較,一直往后點對點比較沦零,前面的b1就不用管了祭隔,采用的就是這樣一種思路去看的。
代碼:
class Solution(object):
def getIntersectionNode(self, headA, headB):
"""
:type head1, head1: ListNode
:rtype: ListNode
"""
p, q = headA, headB
countA = countB = 0
while p != None:
p = p.next
countA += 1
while q != None:
q = q.next
countB += 1
m, n = headA, headB
if countA > countB:
for i in range(countA - countB):
m = m.next
else:
for i in range(countB - countA):
n = n.next
while m != n:
m = m.next
n = n.next
return m
其實代碼可以再精簡一些路操,比如求list長度疾渴,完全可以寫成一個helper函數(shù),到時候調(diào)用即可屯仗。中間的if else就是剛剛說的求出a2搞坝,然后最后的while就是讓兩個list點對點比較,如果相等了祭钉,返回一個值瞄沙,不想等就None
排在最前面的代碼我放出來
class Solution(object):
def getIntersectionNode(self, headA, headB):
"""
:type head1, head1: ListNode
:rtype: ListNode
"""
def length(head):
cnt = 0
while head:
cnt += 1
head = head.next
return cnt
lenA, lenB = length(headA), length(headB)
if lenA < lenB:
headA, headB = headB, headA
lenA, lenB = lenB, lenA
for i in range(lenA-lenB):
headA = headA.next
while headA != headB:
headA, headB = headA.next, headB.next
return headA
這個代碼就很精簡了已經(jīng),他把求長度寫成了函數(shù)慌核,然后簡化了找a2距境,有點東西,大家可以看看垮卓,多琢磨琢磨垫桂。