时间:2020-7-3
题目地址:https://leetcode-cn.com/problems/odd-even-linked-list/
题目难度:Medium
题目描述:
给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。
请尝试使用原地算法完成。你的算法的空间复杂度应为 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
说明:
应当保持奇数节点和偶数节点的相对顺序。
链表的第一个节点视为奇数节点,第二个节点视为偶数节点,以此类推。
思路1:双指针
代码段1:通过
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def oddEvenList(self, head: ListNode) -> ListNode:
if head == None: return None
if head.next == None or head.next.next == None: return head
odd, odd_head, even, even_head, temp, curr = head, head, head.next, head.next, 3, head.next.next
while curr != None:
if temp % 2:
odd.next = curr
odd = odd.next
else:
even.next = curr
even = even.next
curr = curr.next
temp += 1
even.next = None
odd.next = even_head
return odd_head
总结:
- 我写的逻辑冗余且混乱,看下别人放的代码
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def oddEvenList(self, head: ListNode) -> ListNode:
if not head:return head
odd = head
even_head = even = head.next
while odd.next and even.next:
odd.next = odd.next.next
even.next = even.next.next
odd,even = odd.next,even.next
odd.next = even_head
return head