LeetCode328パリティリンクリスト-Pythonダブルポインタソリューション+詳細メモ

タイトル説明

単一リンクリストが与えられた場合、すべての奇数ノードと偶数ノードを一緒に配置します。ここでの奇数ノードと偶数ノードは、ノードの値のパリティではなく、ノード番号のパリティを参照していることに注意してください。

インプレースアルゴリズムを使用して完了してください。アルゴリズムの空間の複雑さは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%を打ち負かす

 

リンクリストの質問は実際には二重のポインタです

おすすめ

転載: blog.csdn.net/authorized_keys/article/details/109672903