142.环形链表
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null
。
为了表示给定链表中的环,我们使用整数 pos
来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果pos
是 -1,则在该链表中没有环。
说明:不允许修改给定的链表。
示例 1:
输入:head = [3,2,0,-4], pos = 1
输出:tail connects to node index 1
解释:链表中有一个环,其尾部连接到第二个节点。
第一种思路,记录visited,遇到时返回,如下:
class Solution(object):
def detectCycle(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
vistied=set()
while head and (head not in vistied):
vistied.add(head)
head=head.next
return head
第二种思路,如果有环,设置快慢指针,从相遇地点开始,慢指针继续移动,从head重新开始,相遇时一定为入环第一个节点。
class Solution(object):
def detectCycle(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
fast=head
slow=head
while fast and fast.next: #注意,当fast不满足时,fast.next不会执行判断,也就是说fast不存在next也行
fast=fast.next.next
slow=slow.next
if fast==slow:
break
else: #while 还有else用法。。。。
return None
while head!=slow:
head=head.next
slow=slow.next
return head
160.相交链表
编写一个程序,找到两个单链表相交的起始节点。
如下面的两个链表:图略
class Solution(object):
def getIntersectionNode(self, headA, headB):
"""
:type head1, head1: ListNode
:rtype: ListNode
"""
if not headA or not headB:
return None
lenA=0
lenB=0
headA_temp=headA
headB_temp=headB
while headA_temp: #首先分别计算长度
lenA+=1
headA_temp=headA_temp.next
while headB_temp:
lenB+=1
headB_temp=headB_temp.next
if lenA>lenB: #调整起点一致
diff=lenA-lenB
while diff!=0:
diff-=1
headA=headA.next
else:
diff=lenB-lenA
while diff!=0:
diff-=1
headB=headB.next
while headA:
if headA==headB: #开始遍历,相等时返回对象
return headA
headA=headA.next
headB=headB.next
return None