LeetCode:链表(二)

本组囊括链表相关题目,难度不等。

24. Swap Nodes in Pairs

题目描述:中等

解法一:

考虑迭代解法,如果要两两交换相邻的节点,则这些节点肯定是相邻的奇偶节点,使用两个指针来遍历所有的奇偶节点。交换后将新节点的头指向第二个的头即可;
除了一个哨兵外,还需要定义一个指针current来更新链表,这个指针指向头节点;

 1 class Solution:
 2     def swapPairs(self, head: ListNode) -> ListNode:
 3         dummy = ListNode(0)
 4         dummy.next = head 
 5         current = dummy
 6         while head and head.next:
 7             # 定位到需要交换的节点
 8             firstNode = head
 9             secondNode = head.next
10 
11             # 开始交换并更新头节点
12             current.next = secondNode
13             firstNode.next = secondNode.next
14             secondNode.next = firstNode
15 
16             # 重新初始化head和curernt.next
17             current = firstNode
18             head = firstNode.next
19 
20         return dummy.next
21         # 时间复杂度: O(n)
22         # 空间复杂度: O(1)

 

83. Remove Duplicates from Sorted List

题目描述:简单

解法一:

这道题测试操作列表的结点指针的能力。由于输入的列表已排序,因此我们可以通过将结点的值与它之后的结点进行比较来确定它是否为重复结点。如果它是重复的,我们更改当前结点的 next 指针,以便它跳过下一个结点并直接指向下一个结点之后的结点。

 1 class Solution:
 2     def deleteDuplicates(self, head: ListNode) -> ListNode:
 3         # 迭代,遍历
 4         dummy = ListNode(0)
 5         dummy.next = head # 哑节点
 6         while head and head.next:
 7             if head.next.val == head.val:  # 如果全部都是重复的,那么最后第一个节点的next会指向None,即最后返回只会返回第一个指针。
 8                 head.next = head.next.next
 9             else:
10                 head = head.next
11         return dummy.next
12         # 时间复杂度: O(n)
13         # 空间复杂度: O(1)

 

 

82. Remove Duplicates from Sorted List II

题目描述:中等

解法一:

上一题是这道题的简版,只用删除重复的其他就行,这道题是需要删除所有重复的只保留没有重复出现的数字;
上一题做法是重复的话当前指针就指向下下个节点,这题的逻辑应该是如果重复的话当前节点的上一节点指针指向下下个节点,于是我们能想到的就是再多定义一个指针,用两个指针不断往前移动求解;
这里需要注意的是逻辑为两个指针指向下一个节点的值是否相等。

 1 class Solution:
 2     def deleteDuplicates(self, head: ListNode) -> ListNode:
 3         dummy = ListNode(0) # 哨兵节点
 4         dummy.next = head
 5         a = dummy
 6         b = head
 7         while b and b.next:
 8             if a.next.val != b.next.val:
 9                 a = a.next
10                 b = b.next
11             else:
12                 while b and b.next and a.next.val == b.next.val: # 若相等,则单独移动b指针,直到两个指针指向的下一个值不等。再移动b指针,让a指针指向b。
13                     b = b.next
14                 a.next = b.next
15                 b = b.next # 相对位置,b也移动
16         return dummy.next
17         # 时间复杂度: O(n)
18         # 空间复杂度: O(1)

 

posted @ 2020-11-10 10:26  Jesse-jia  阅读(87)  评论(0编辑  收藏  举报