'''
编写一个程序,找到两个单链表相交的起始节点。
注意:
如果两个链表没有交点,返回 null.
在返回结果后,两个链表仍须保持原有的结构。
可假定整个链表结构中没有循环。
程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
'''
双指针法算法说明:两个链表长度不一定相等,但是拼接在一起以后一定等长。pA和pB开始分别指向hA和hB,然后分别遍历两个链表。
假设链表hA比hB长,则当pB指向None时,pA仍指向链表hA的某个结点。接下来pA继续后移一位,pB指向hA。
二者继续后移,则当pA指向None时,pB仍指向链表hA的某个结点。接下来pB继续后移一位,pA指向hB,此时pA和pB对齐了。
之后二者继续后移,当pA==pB时,说明二者指向了同一结点(也可能同时指向了None),循环结束。
# Definition for singly-linked list.
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
'''算法1:暴力枚举
执行用时: 超出时间限制
内存消耗: 17.0 MB, 在所有 python3 提交中击败了23.80%的用户
'''
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
pA = headA
while pA:
pB = headB
while pB:
if pA == pB:
return pA
else:
pB = pB.next
pA = pA.next
else:
return None
'''算法2:哈希查找
执行用时: 168 ms, 在所有 python3 提交中击败了79.35%的用户
内存消耗: 28.3 MB, 在所有 python3 提交中击败了90.80%的用户
'''
def getIntersectionNode2(self, headA: ListNode, headB: ListNode) -> ListNode:
lib = set()
pA = headA
while pA:
lib.add(pA)
pA = pA.next
pB = headB
while pB:
if pB in lib:
return pB
else:
pB = pB.next
else:
return None
'''算法3:双指针法
执行用时: 156 ms, 在所有 python3 提交中击败了95.62%的用户
内存消耗: 27.9 MB, 在所有 python3 提交中击败了99.80%的用户
'''
def getIntersectionNode3(self, headA: ListNode, headB: ListNode) -> ListNode:
pA, pB = headA, headB
while pA != pB:
pA = pA.next if pA else headB
pB = pB.next if pB else headA
return pA
'''算法4:双指针法
执行用时: 160 ms, 在所有 python3 提交中击败了91.69%的用户
内存消耗: 28 MB, 在所有 python3 提交中击败了99.80%的用户
'''
def getIntersectionNode4(self, headA: ListNode, headB: ListNode) -> ListNode:
if headA is None or headB is None:
return None
pA, pB = headA, headB
for i in range(2):#pA和pB各指向None一次,然后二者刚好对齐
while pA and pB:
pA, pB = pA.next, pB.next
if pA is None:
pA = headB
else:
pB = headA
while pA != pB: #遍历可能存在共同结点的区域
pA, pB = pA.next, pB.next
return pA
a = 99
b = 8 if a == 9 else 80
print(b)
a = [2, 4, 3, 5, 8]
b = [5, 6, 4]
c = [1,2,3,4]
p = ha = ListNode(0)
for x in a:
p.next = ListNode(x)
p = p.next
p = hb = ListNode(0)
for x in b:
p.next = ListNode(x)
p = p.next
p = hc = ListNode(0)
for x in c:
p.next = ListNode(x)
p = p.next
p = ha
while p.next is not None:
p = p.next
p.next = hc.next
p = hb
while p.next is not None:
p = p.next
p.next = hc.next
p = ha.next
while p is not None:
print(p.val, end=' ')
p = p.next
print()
p = hb.next
while p is not None:
print(p.val, end=' ')
p = p.next
print()
x = Solution()
p = x.getIntersectionNode4(ha.next, hb.next)
while p:
print(p.val, end=' ')
p = p.next
print()
来源:CSDN
作者:QiaoRuoZhuo
链接:https://blog.csdn.net/QiaoRuoZhuo/article/details/103639484