|奇偶链表
给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。
请尝试使用原地算法完成。你的算法的空间复杂度应为 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
|题解
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
"""
解题思路:
1.通过count记录节点位置,按奇偶划分
2.分别创建 奇数头指针 和 偶数头指针
3.把对应位置的数据用头指针串联起来
4.奇数链表和偶数链表拼接
"""
def oddEvenList(self, head: ListNode) -> ListNode:
cur = head
count = 1 # 记录当前节点的位置
# even_head 作为偶数链表的头指针
even_head = None
even_tail = None
# 引入偶数链表的虚拟头节点,目的是使下面的处理逻辑保持一致
node = ListNode()
even_head = node
even_tail = even_head
# odd_head 作为奇数链表的头指针
odd_head = None
odd_tail = None
# 引入奇数链表的虚拟头节点,目的是使下面的处理逻辑保持一致
node = ListNode()
odd_head = node
odd_tail = odd_head
while cur:
per = cur.next
# count跟2求余,如果余数为0,则当前节点为偶数节点,否则为奇数节点
cur.next = None # 赋值为None的目的是 只区当前节点,截断后面的节点,如果不截断会出现最后一个节点,即在奇数链表,又在偶数链表
if count % 2 == 0:
even_tail.next = cur
even_tail = cur
else:
odd_tail.next = cur
odd_tail = cur
count += 1
cur = per
odd_tail.next = even_head.next
return odd_head.next
903



被折叠的 条评论
为什么被折叠?



