解法1
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
"""
首刷
O(n)时间复杂度
顺序不能变
分开2条链
难点:停止条件是什么?
"""
class Solution(object):
def oddEvenList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
dummy_odd = ListNode(-1)
cur_odd = dummy_odd
dummy_even = ListNode(-2)
cur_even = dummy_even
count = 1
cur = head
while cur:
if count % 2 == 0:
cur_even.next = cur
cur = cur.next
cur_even = cur_even.next
cur_even.next = None #断掉
else:
cur_odd.next = cur
cur = cur.next
cur_odd = cur_odd.next
cur_odd.next = None #断掉
count += 1
cur_odd.next = dummy_even.next
return dummy_odd.next
解法2:与解法1差不多
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
"""
首刷
O(n)时间复杂度
顺序不能变
分开2条链
难点:停止条件是什么?
解法1
分开两条链:空间4个空间
解法2:
优化解法1 只开3个空间
"""
class Solution(object):
def oddEvenList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if not head or not head.next:
return head
odd = head
even = head.next
even_head = head.next
#类似于求中点的快指针
while even and even.next:
odd.next = even.next
odd = odd.next
even.next = odd.next
even = even.next
odd.next = even_head
return head