返回

LeetCode第328题:奇偶链表答案解析——揭秘隐藏的数学规律,玩转链表改造!

前端

导读:

链表,作为数据结构家族中的一员,以其灵活性、适用性广等特点,深受程序员的青睐。而在LeetCode第328题中,我们迎来了一个颇具挑战性的任务:将给定单链表中的奇数节点和偶数节点分别排在一起,并且要在不增加额外空间复杂度的前提下完成。

正文:

  1. 题意解析:

    • 目标: 奇偶分离,重组链表。
    • 约束: 原地算法,空间复杂度为O(1)。
  2. 数学规律:

    • 关键点: 节点编号的奇偶性。
    • 奇偶交错: 奇数节点编号为1、3、5…,偶数节点编号为2、4、6…,二者交错出现。
  3. 算法设计:

    • 思路: 巧妙利用哑节点(dummy node)。
    • 步骤:
      1. 初始化两个哑节点head1和head2,分别指向奇数链表和偶数链表的头节点。
      2. 设置两个指针curr和next,指向当前节点和下一个节点。
      3. 将curr指向的节点连接到head1或head2的末尾,curr后移一位。
      4. 将next指向的节点连接到head2或head1的末尾,curr和next同时后移一位。
      5. 重复步骤3和步骤4,直到所有节点都处理完毕。
      6. 将head2的下一个节点指向head1,完成合并。
  4. 代码实现:

    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题向我们展示了算法改造链表的独特魅力,利用数学规律巧妙地将奇偶节点分离,并在不增加额外空间复杂度的约束下实现了算法。希望这篇文章能够帮助您更深入地理解链表改造,让您在编程的道路上更上一层楼!