赞
踩
题目:编写一个程序,找到两个单链表相交的起始节点。例如,下面的两个链表在节点 c1 开始相交。
A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3
思路:
代码:
- # 思路2
- class Solution(object):
- def getIntersectionNode(self, headA, headB):
- """
- :type head1, head1: ListNode
- :rtype: ListNode
- """
- lenA, lenB = 0, 0
- pA = headA
- pB = headB
- while pA:
- pA = pA.next
- lenA += 1
- while pB:
- pB = pB.next
- lenB += 1
- pA = headA
- pB = headB
- if lenA > lenB:
- for i in range(lenA-lenB):
- pA = pA.next
- else:
- for i in range(lenB-lenA):
- pB = pB.next
- while pA!=pB:
- pA = pA.next
- pB = pB.next
- return pA
但是!!!有大神给出了极为简洁的解法,其思路是这样的:分别将两个列表连接到对方链表的末尾,则得到的两个链表长度是相同的,若原两个链表相交,则在从头遍历两个新链表时一定会存在一个位置相同(这么说有点抽象,自己画一下就知道了)
上代码!
- class Solution(object):
- def getIntersectionNode(self, headA, headB):
- """
- :type head1, head1: ListNode
- :rtype: ListNode
- """
- p1 = headA
- p2 = headB
- while(p1 != p2):
- p1 = headB if p1 == None else p1.next
- p2 = headA if p2 == None else p2.next
- return p1
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。