leetcode解题:数组&链表

与链表有关的操作和算法题往往考的不是思维能力,代码能力才是面试官关注的

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
解释:链表中有一个环,其尾部连接到第二个节点。

leetcode解题:数组&链表_第1张图片
示例2:

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

leetcode解题:数组&链表_第2张图片
示例3:

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

3

你能用 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

你可能感兴趣的:(数据结构和算法,leetcode刷题之路)