算法 LC 鏈表-奇偶鏈表

題目描述

給定單鏈表的頭節(jié)點 head 硝枉,將所有索引為奇數(shù)的節(jié)點和索引為偶數(shù)的節(jié)點分別組合在一起妻味,然后返回重新排序的列表责球。

第一個節(jié)點的索引被認為是 奇數(shù) 雏逾, 第二個節(jié)點的索引為 偶數(shù) 栖博,以此類推仇让。

請注意躺翻,偶數(shù)組和奇數(shù)組內部的相對順序應該與輸入時保持一致获枝。
你必須在 O(1) 的額外空間復雜度和 O(n) 的時間復雜度下解決這個問題

示例1:


截屏2022-03-15 下午5.21.02.png

輸入: head = [1,2,3,4,5]
輸出: [1,3,5,2,4]

示例2:


截屏2022-03-15 下午5.20.56.png

輸入: head = [2,1,3,5,6,4,7]
輸出: [2,3,6,7,1,5,4]

題解

對于原始鏈表省店,每個節(jié)點都是奇數(shù)節(jié)點或偶數(shù)節(jié)點懦傍。頭節(jié)點是奇數(shù)節(jié)點粗俱,頭節(jié)點的后一個節(jié)點是偶數(shù)節(jié)點寸认,相鄰節(jié)點的奇偶性不同。因此可以將奇數(shù)節(jié)點和偶數(shù)節(jié)點分離成奇數(shù)鏈表和偶數(shù)鏈表唱蒸,然后將偶數(shù)鏈表連接在奇數(shù)鏈表之后神汹,合并后的鏈表即為結果鏈表

思路1:
原始鏈表的頭節(jié)點 head 也是奇數(shù)鏈表的頭節(jié)點以及結果鏈表的頭節(jié)點屁魏,head 的后一個節(jié)點是偶數(shù)鏈表的頭節(jié)點氓拼。令 evenHead = head.next披诗,則 evenHead 是偶數(shù)鏈表的頭節(jié)點立磁。

維護兩個指針 odd 和 even 分別指向奇數(shù)節(jié)點和偶數(shù)節(jié)點宪摧,初始時 odd = head几于,even = evenHead沿后。通過迭代的方式將奇數(shù)節(jié)點和偶數(shù)節(jié)點分離成兩個鏈表尖滚,每一步首先更新奇數(shù)節(jié)點睦裳,然后更新偶數(shù)節(jié)點。

更新奇數(shù)節(jié)點時撼唾,奇數(shù)節(jié)點的后一個節(jié)點需要指向偶數(shù)節(jié)點的后一個節(jié)點廉邑,因此令 odd.next = even.next,然后令 odd = odd.next,此時 odd 變成 even 的后一個節(jié)點蛛蒙。
更新偶數(shù)節(jié)點時糙箍,偶數(shù)節(jié)點的后一個節(jié)點需要指向奇數(shù)節(jié)點的后一個節(jié)點,因此令 even.next = odd.next牵祟,然后令 even = even.next倍靡,此時 even 變成 odd 的后一個節(jié)點。

在上述操作之后课舍,即完成了對一個奇數(shù)節(jié)點和一個偶數(shù)節(jié)點的分離塌西。重復上述操作,直到全部節(jié)點分離完畢筝尾。全部節(jié)點分離完畢的條件是 even 為空節(jié)點或者 even.next 為空節(jié)點,此時 odd 指向最后一個奇數(shù)節(jié)點(即奇數(shù)鏈表的最后一個節(jié)點)。

最后令 odd.next = evenHead,將偶數(shù)鏈表連接在奇數(shù)鏈表之后汰蓉,即完成了奇數(shù)鏈表和偶數(shù)鏈表的合并,結果鏈表的頭節(jié)點仍然是 head

截屏2022-03-15 下午6.24.26.png
// OC
+ (ListNode *)oddEvenList1:(ListNode *)head {
    ListNode *odd = head;
    ListNode *evenHead = head.next;
    ListNode *even = head.next;
    
    while (even != nil && even.next != nil) {
        // 奇數(shù)節(jié)點的下一個節(jié)點指向偶數(shù)節(jié)點的next
        odd.next = even.next;
        // odd 變成 even 的后一個節(jié)點
        odd = odd.next;
        
        // 偶數(shù)節(jié)點的下一個節(jié)點指向奇數(shù)節(jié)點的next
        even.next = odd.next;
        // even 變成 odd 的后一個節(jié)點
        even = even.next;
    }
    
    odd.next = evenHead;
    
    return head;

}
// Swift
    static public func oddEvenList1(_ head:ListNode?) -> ListNode? {
        if head == nil {
            return head
        }
        // 偶數(shù)鏈表的頭節(jié)點
        let evenHead = head?.next
        var odd = head
        var even = head?.next
        while even != nil && even?.next != nil {
            // 奇數(shù)節(jié)點的后一個節(jié)點需要指向偶數(shù)節(jié)點的后一個節(jié)點
            odd?.next = even?.next
            //  odd 變成 even 的后一個節(jié)點
            odd = odd?.next
            // 偶數(shù)節(jié)點的后一個節(jié)點需要指向奇數(shù)節(jié)點的后一個節(jié)點
            even?.next = odd?.next
            // even 變成 odd 的后一個節(jié)點
            even = even?.next
        }
        
        odd?.next = evenHead
        
        return head
        
    }

思路2:
令evenHeadNode = head?.next 則 evenHeadNode 為偶數(shù)鏈表的頭節(jié)點灾常,oddTailNode為奇數(shù)鏈表的尾部節(jié)點
遍歷所有節(jié)點,奇數(shù)節(jié)點的Next指向下一個奇數(shù)節(jié)點,偶數(shù)節(jié)點的Next指向下一個偶數(shù)節(jié)點,即curNode?.next = curNode?.next?.next,并且判斷當前奇數(shù)鏈表是否遍歷完成落剪,如果奇數(shù)節(jié)點便利結束凡泣,則令oddTailNode = curNode
在遍歷結束后,合并奇數(shù)鏈表和偶數(shù)鏈表,即oddTailNode?.next = evenHeadNode

// OC
+ (ListNode *)oddEvenList2:(ListNode *)head {
    // 記錄偶數(shù)鏈表的頭部
    ListNode *evenHeadNode = head.next;
    // 記錄奇數(shù)鏈表的尾部
    ListNode *oddTailNode = nil;
    ListNode *curNode = head;
    // 奇偶 true為奇數(shù),false偶數(shù)
    BOOL flag = YES;
    while (curNode != nil) {
        if (flag && (curNode.next == nil || curNode.next.next == nil)) {
            oddTailNode = curNode;
        }
        ListNode *nextNode = curNode.next;
        curNode.next = curNode.next.next;
        curNode = nextNode;
        flag = !flag;
    }
    
    oddTailNode.next = evenHeadNode;
    
    return head;
}
// Swift
    static public func oddEvenList2(_ head:ListNode?) -> ListNode? {
        if head == nil {
            return head
        }
        var curNode = head
        // 記錄偶數(shù)鏈表的頭部
        let evenHeadNode = head?.next
        // 記錄奇數(shù)鏈表的尾部
        var oddTailNode:ListNode?
        // 奇偶 true為奇數(shù)项阴,false偶數(shù)
        var flag:Bool = true
        while(curNode != nil) {
            if flag && (curNode?.next == nil || curNode?.next?.next == nil) {
                // 奇數(shù)鏈表 循環(huán)完畢
                oddTailNode = curNode
            }
            // 下次遍歷節(jié)點
            let nextNode = curNode?.next
            // curNode?.next = curNode?.next?.next
            // 當前節(jié)點的next指向當前節(jié)點的Next的Next
            curNode?.next = curNode?.next?.next
            curNode = nextNode
            
            flag = !flag
            
        }
        oddTailNode?.next = evenHeadNode
        return head
    }

參考:https://leetcode-cn.com/leetbook/read/top-interview-questions-medium/xvdwtj/
https://leetcode-cn.com/problems/odd-even-linked-list/solution/qi-ou-lian-biao-by-leetcode-solution/

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市通今,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖感耙,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門砸捏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伞访,“玉大人级解,你說我怎么就攤上這事辛馆√桑” “怎么了同蜻?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我忱反,道長,這世上最難降的妖魔是什么温算? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任怜校,我火速辦了婚禮茄茁,結果婚禮上付燥,老公的妹妹穿的比我還像新娘勋颖。我一直安慰自己叁执,他們只是感情好,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著勋拟,像睡著了一般勋磕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上敢靡,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天挂滓,我揣著相機與錄音,去河邊找鬼啸胧。 笑死赶站,一個胖子當著我的面吹牛幔虏,可吹牛的內容都是我干的。 我是一名探鬼主播贝椿,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼想括,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了烙博?” 一聲冷哼從身側響起瑟蜈,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎习勤,沒想到半個月后踪栋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體焙格,經...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡图毕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了眷唉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片予颤。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖冬阳,靈堂內的尸體忽然破棺而出蛤虐,到底是詐尸還是另有隱情,我是刑警寧澤肝陪,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布驳庭,位于F島的核電站,受9級特大地震影響氯窍,放射性物質發(fā)生泄漏饲常。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一狼讨、第九天 我趴在偏房一處隱蔽的房頂上張望贝淤。 院中可真熱鬧,春花似錦政供、人聲如沸播聪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽离陶。三九已至,卻和暖如春衅檀,著一層夾襖步出監(jiān)牢的瞬間招刨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工术吝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留计济,地道東北人茸苇。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像沦寂,于是被迫代替她去往敵國和親学密。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內容

  • 給定一個單鏈表传藏,把所有的奇數(shù)節(jié)點和偶數(shù)節(jié)點分別排在一起腻暮。請注意,這里的奇數(shù)節(jié)點和偶數(shù)節(jié)點指的是節(jié)點編號的奇偶性毯侦,而...
    Spring_java閱讀 627評論 0 1
  • 一哭靖、反轉問題 2021.02.11 No.25 K個一組翻轉鏈表 給你一個鏈表,每 k 個節(jié)點一組進行翻轉侈离,請你返...
    維李設論閱讀 582評論 0 0
  • 大廠算法面試之leetcode精講15.鏈表 視頻講解(高效學習):點擊學習[https://xiaochen10...
    全棧瀟晨閱讀 141評論 0 0
  • 奇偶鏈表 問題描述給定一個單鏈表试幽,把所有的奇數(shù)節(jié)點和偶數(shù)節(jié)點分別排在一起。請注意卦碾,這里的奇數(shù)節(jié)點和偶數(shù)節(jié)點指的是節(jié)...
    zsdy閱讀 289評論 0 0
  • 給定一個單鏈表铺坞,把所有的奇數(shù)節(jié)點和偶數(shù)節(jié)點分別排在一起。請注意洲胖,這里的奇數(shù)節(jié)點和偶數(shù)節(jié)點指的是節(jié)點編號的奇偶性济榨,而...
    MzDavid閱讀 538評論 0 0