1. 程式人生 > 實用技巧 >leetcode刷題筆記328題 奇偶連結串列

leetcode刷題筆記328題 奇偶連結串列

leetcode刷題筆記328題 奇偶連結串列

地址:328. 奇偶連結串列

問題描述:

給定一個單鏈表,把所有的奇數節點和偶數節點分別排在一起。請注意,這裡的奇數節點和偶數節點指的是節點編號的奇偶性,而不是節點的值的奇偶性。

請嘗試使用原地演算法完成。你的演算法的空間複雜度應為 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(_x: Int = 0, _next: ListNode = null) {
 *   var next: ListNode = _next
 *   var x: Int = _x
 * }
 */
object Solution {
    def oddEvenList(head: ListNode): ListNode = {
        if (head == null) return head
        var odd = head
        val evenHead = head.next
        var even = evenHead
        
        while (even != null && even.next != null) {
            odd.next = even.next
            odd = odd.next
            even.next = odd.next
            even = even.next
        }
        odd.next = evenHead
        return head
    }
}
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func oddEvenList(head *ListNode) *ListNode {
    if head == nil {return head}

    odd := head
    even := head.Next
    evenHead := head.Next
    
    //分別構建奇數連結串列與偶數連結串列,將偶數連結串列掛在奇數連結串列後
    for (even != nil && even.Next != nil){
        odd.Next = even.Next
        odd = odd.Next
        even.Next = odd.Next
        even = even.Next
    }
    odd.Next = evenHead
    return head
}