与链表有关的操作和算法题往往考的不是思维能力,代码能力才是面试官关注的。
206. 反转链表
反转一个单链表。
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
PS:这个题目考的不是思维能力,而是代码能力、代码简洁程度。所以这儿背下来链表反转常用的语句是很有必要的。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
prev, cur = None, head
while cur:
cur.next, prev, cur = prev, cur, cur.next
return prev
执行用时 : 60 ms, 在Reverse Linked List的Python3提交中击败了66.71% 的用户
。内存消耗 : 14.4 MB, 在Reverse Linked List的Python3提交中击败了79.49% 的用户
24. 两两交换链表中的节点
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
给定 1->2->3->4, 你应该返回 2->1->4->3.
这个题目最好以不超过10行代码完成。对代码的简洁程度要求更高,所以还是要背下。
做这个题目的时候建议先画示意图,再跟着思路写出来。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def swapPairs(self, head: ListNode) -> ListNode:
prev, prev.next = self, head
while prev.next and prev.next.next:
a = prev.next
b = a.next
prev.next, a.next, b.next = b, b.next, a
prev = a
return self.next
执行用时 : 84 ms, 在Swap Nodes in Pairs的Python3提交中击败了11.05% 的用户。
内存消耗 : 13.2 MB, 在Swap Nodes in Pairs的Python3提交中击败了44.77% 的用户。
141.环形链表
给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
示例1:
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
示例2:
输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。
示例3:
输入:head = [1], pos = -1
输出:false
解释:链表中没有环。
你能用 O(1)(即,常量)内存解决此问题吗?
这里用了快慢指针,但是这种方法不是一上来就能想到的,所以有些跳跃了,不好想。
class ListNode:
def __init__(self):
self.val = x
self.next = None
class Solution:
def hasCycle(self, head) -> ListNode:
"""
:type head: ListNode
:rtype: bool
"""
# 快慢指针
fast = slow = head
while slow and fast and fast.next:
slow = slow.next
fast = fast.next.next
if slow is fast:
return True
return False