链表求环
1、通过快慢追赶的方法确定是否有还的存在
2、如果链表存在环,在通过循环来获得环的起点
'''链表求环 leetCode 142'''
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
def printlist(head):
while(head !=None):
print(head.val,end=',')
head=head.next
class Solution(object):
def detectCycle(self, head):
one_step=head
two_step=head
'''判断链表是否有环'''
while ( two_step!=None):
one_step=one_step.next
two_step=two_step.next
if two_step==None:
return None
two_step=two_step.next
if (one_step==two_step):
break
'''查找链表环的起点'''
while(head and one_step):
if head==one_step:
return head
else:
head=head.next
one_step=one_step.next
return None
'''定义链表节点'''
p1,p2,p3,p4,p5,p6,p7=ListNode(1),ListNode(2),ListNode(3),ListNode(4),ListNode(5),ListNode(6),ListNode(7)
p8,p9,p10,p11,p12,p13,p14=ListNode(8),ListNode(9),ListNode(10),ListNode(11),ListNode(12),ListNode(13),ListNode(14)
'''生成链表'''
p1.next=p2
p2.next=p3
p3.next=p4
p4.next=p5
p5.next=p6
p6.next=p7
p7.next=p8
p8.next=p9
p9.next=p10
p10.next=p11
p11.next=p12
p12.next=p13
p13.next=p14
'''定义链表的环起点'''
p14.next=p7
'''求环'''
x=Solution()
mp=x.detectCycle(p1)
print(mp.val)
单项链表求交点
1、单向链表如果存在交点,那么尾部一定存在相同的一部分
2、将两个链表按尾部依此对其,移动较长链表使指针与较短链表对其(长度对齐)
3、依此比较两个链表剩余的节点,相等即存在交点。
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution(object):
'''计算链表长度'''
def get_list_len(self,l):
cnt=0
while (l!=None):
cnt=cnt+1
l=l.next
return cnt
'''移动链表到第dalta个元素 '''
def move_list_for_dalta(self,l,dalta):
while(dalta):
l=l.next
dalta=dalta-1
return l
def getIntersectionNode(self, headA, headB):
a_len=self.get_list_len(headA)
b_len=self.get_list_len(headB)
'''哪个链表更长就需要移动到对齐'''
if (a_len>b_len):
headA=self.move_list_for_dalta(headA,a_len-b_len)
elif(a_len<b_len):
headB=self.move_list_for_dalta(headB,b_len-a_len)
else:
pass
'''对齐后依次比较接下来的元素,如果存在相等,即存在交点,否则不存在交点'''
while(headA and headB):
if (headA==headB):
return headA
else:
headA=headA.next
headB=headB.next
return None
p1,p2,p3,p4,p5,p6,p7=ListNode(1),ListNode(2),ListNode(3),ListNode(4),ListNode(5),ListNode(6),ListNode(7)
p8,p9,p10,p11,p12,p13,p14=ListNode(8),ListNode(9),ListNode(10),ListNode(11),ListNode(12),ListNode(13),ListNode(14)
'''链表相同部分怕2为交点'''
p12.next=p13
p13.next=p14
'''第一条链表'''
p1.next=p2
p2.next=p3
p3.next=p12
'''第二条链表'''
p4.next=p5
p5.next=p6
p6.next=p7
p7.next=p8
p8.next=p9
p9.next=p10
p10.next=p11
p11.next=p12
x=Solution()
out=x.getIntersectionNode(p1,p4)
print(out.val)