タイトル説明
単一リンクリストが与えられた場合、すべての奇数ノードと偶数ノードを一緒に配置します。ここでの奇数ノードと偶数ノードは、ノードの値のパリティではなく、ノード番号のパリティを参照していることに注意してください。
インプレースアルゴリズムを使用して完了してください。アルゴリズムの空間の複雑さはO(1)であり、時間の複雑さはO(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
説明:奇数ノードと偶数ノードの相対的な順序を維持する必要があります。
リンクリストの最初のノードは奇数ノードと見なされ、2番目のノードは偶数ノードと見なされます。出典:LeetCode
リンク:https ://leetcode-cn.com/problems/odd-even-linked-list
著作権はLeetCodeが所有しています。商用の再版については、公式の承認に連絡してください。非商用の再版については、出典を示してください。
解決
# 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 not head or not head.next:
return head
odd = head # 奇数指针,从原始链表的第1个节点开始
even = head.next # 偶数指针,从原始链表的第2个节点开始
even_head = even # 偶数链的头节点,后续将奇数链的尾部指向它
# 偶数指针走的快一步,因此以偶数指针为停止循环的依据
while even and even.next:
odd.next = even.next # 奇数指针指向偶数指针的下一个(也就是下一个奇数节点)
odd = odd.next
even.next = odd.next # 偶数指针指向此时奇数指针的下一个(也就是下一个偶数节点)
even = even.next
# 将奇数链的尾部指向偶数链的头节点,此时从head指针指向新顺序的链表头节点
odd.next = even_head
return head
答えは成功しました:
実行時間:44ミリ秒、Python3ユーザーの97.79%を打ち負かす
メモリ消費量:15.3 MB、Python3ユーザーの78.96%を打ち負かす
リンクリストの質問は実際には二重のポインタです