24.两两交换链表节点
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
输入:head = [1,2,3,4] 输出:[2,1,4,3]
示例 2:
输入:head = [] 输出:[]
示例 3:
输入:head = [1] 输出:[1]
思考:首先明确题意,仅交换相邻节点,节点只参与一次交换
若为空链表,或链表中只有一个节点则直接返回
交换节点顺序涉及到节点指针的改变,要注意节点之间的连接
错误点:开始只考虑改变两节点索引,这在前两个之间是适用的,若还要将链表联系起来,还需使用一个节点代表前方节点指向后方节点组
class Solution(object):
def swapPairs(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if not head or not head.next:
return head
mpre = ListNode()
mpre.next = head
pre = head
p = head.next
while p and pre:
mpre.next = p
pre.next = p.next
p.next = pre
if pre == head:
head = p
mpre = pre
pre = pre.next
p = pre.next if pre is not None else None
return head
141.环形链表
给你一个链表的头节点 head
,判断链表中是否有环。
如果链表中存在环 ,则返回 true
。 否则,返回 false
。
示例 1:
输入:head = [3,2,0,-4], pos = 1 输出:true 解释:链表中有一个环,其尾部连接到第二个节点。
示例 2:
输入:head = [1,2], pos = 0 输出:true 解释:链表中有一个环,其尾部连接到第一个节点。
示例 3:
输入:head = [1], pos = -1 输出:false 解释:链表中没有环。
思考:用快慢指针遍历链表,fast指针走两步,slow指针走一步
若有环则两指针一定会相遇,因为可以把fast指针走两步,slow指针走一步,看作是fast指针在一步一步向slow指针靠近(有点暧昧了哈哈哈)
若无环fast一定会先为空
class Solution(object):
def hasCycle(self, head):
"""
:type head: ListNode
:rtype: bool
"""
slow = head
fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
if fast == slow:
return True
return False
142.环形链表二——判断环的入口
给定一个链表的头节点 head
,返回链表开始入环的第一个节点。 如果链表无环,则返回 null
。
如果链表中有某个节点,可以通过连续跟踪 next
指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos
来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos
是 -1
,则在该链表中没有环。注意:pos
不作为参数进行传递,仅仅是为了标识链表的实际情况。
不允许修改 链表。
示例 1:
输入:head = [3,2,0,-4], pos = 1 输出:返回索引为 1 的链表节点 解释:链表中有一个环,其尾部连接到第二个节点。
示例 2:
输入:head = [1,2], pos = 0 输出:返回索引为 0 的链表节点 解释:链表中有一个环,其尾部连接到第一个节点。
示例 3:
输入:head = [1], pos = -1 输出:返回 null 解释:链表中没有环。
思考:
如果链表为空或只有一个节点则无环直接返回空
使用快慢指针得到两指针相遇点,指定一指针从头开始,一指针从相遇点开始,两指针相遇点即为环入口
class Solution(object):
def detectCycle(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if not head or not head.next:
return None
slow = head
fast = head
while fast and fast.next:
fast = fast.next.next
slow = slow.next
if slow == fast:
break
if not fast or not fast.next:
return None
l1 = head
l2 = slow
while l1 != l2:
l1 = l1.next
l2 = l2.next
return l1