328. Odd Even Linked List

题目描述

给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。

请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。

示例 1:

输入: 1->2->3->4->5->NULL
输出: 1->3->5->2->4->NULL

示例 2:

输入: 2->1->3->5->6->4->7->NULL 
输出: 2->3->6->7->1->5->4->NULL

说明:

  • 应当保持奇数节点和偶数节点的相对顺序。
  • 链表的第一个节点视为奇数节点,第二个节点视为偶数节点,以此类推。

我的解法——交叉遍历(AC)

  • 一定要奇偶交替遍历,如果先遍历奇数再遍历偶数的话,就找不到指针了。
  • 时间复杂度O(n),空间复杂度O(1)
  • Beat 57%
# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def oddEvenList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        if(head is None):
            return head
        elif(head.next is None):
            return head
        else:
            temp1 = head
            temp2 = head.next
        
        head2 = temp2  # 注意这个变量很重要
        flag1 = True
        flag2 = True
        
        while(flag1 or flag2):
            if(flag1):
                if(temp1.next is not None and temp1.next.next is not None):
                    temp1.next = temp1.next.next
                    temp1 = temp1.next
                else:
                    temp1.next = head2  # 这里不能为temp2
                    flag1 = False
                    
            if(flag2):
                if(temp2.next is not None and temp2.next.next is not None):
                    temp2.next = temp2.next.next
                    temp2 = temp2.next
                else:
                    temp2.next = None
                    flag2 = False
        
        return head

参考答案

  • https://leetcode.com/problems/odd-even-linked-list/solution/