返回
LeetCode第328题:奇偶链表答案解析——揭秘隐藏的数学规律,玩转链表改造!
前端
2023-09-01 09:00:17
导读:
链表,作为数据结构家族中的一员,以其灵活性、适用性广等特点,深受程序员的青睐。而在LeetCode第328题中,我们迎来了一个颇具挑战性的任务:将给定单链表中的奇数节点和偶数节点分别排在一起,并且要在不增加额外空间复杂度的前提下完成。
正文:
-
题意解析:
- 目标: 奇偶分离,重组链表。
- 约束: 原地算法,空间复杂度为O(1)。
-
数学规律:
- 关键点: 节点编号的奇偶性。
- 奇偶交错: 奇数节点编号为1、3、5…,偶数节点编号为2、4、6…,二者交错出现。
-
算法设计:
- 思路: 巧妙利用哑节点(dummy node)。
- 步骤:
- 初始化两个哑节点head1和head2,分别指向奇数链表和偶数链表的头节点。
- 设置两个指针curr和next,指向当前节点和下一个节点。
- 将curr指向的节点连接到head1或head2的末尾,curr后移一位。
- 将next指向的节点连接到head2或head1的末尾,curr和next同时后移一位。
- 重复步骤3和步骤4,直到所有节点都处理完毕。
- 将head2的下一个节点指向head1,完成合并。
-
代码实现:
def oddEvenList(head): # 初始化哑节点 dummy1 = ListNode(0) dummy2 = ListNode(0) # 设置指针 curr = head next = None # 奇偶链表的尾节点 tail1 = dummy1 tail2 = dummy2 # 链表改造 while curr: next = curr.next # 奇数节点 if curr.val % 2 == 1: tail1.next = curr tail1 = tail1.next # 偶数节点 else: tail2.next = curr tail2 = tail2.next # 移动指针 curr = next # 合并链表 tail2.next = dummy1.next return dummy2.next
结语:
LeetCode第328题向我们展示了算法改造链表的独特魅力,利用数学规律巧妙地将奇偶节点分离,并在不增加额外空间复杂度的约束下实现了算法。希望这篇文章能够帮助您更深入地理解链表改造,让您在编程的道路上更上一层楼!