​LeetCode刷題實戰138:複製帶隨機指針的鍊表

2021-02-08 程序IT圈
算法的重要性,我就不多說了吧,想去大廠,就必須要經過基礎知識和業務邏輯面試+算法面試。所以,為了提高大家的算法能力,這個公眾號後續每天帶大家做一道算法題,題目就從LeetCode上面選 !今天和大家聊的問題叫做 複製帶隨機指針的鍊表,我們先來看題面:https://leetcode-cn.com/problems/copy-list-with-random-pointer/

A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.


Return a deep copy of the list.


The Linked List is represented in the input/output as a list of n nodes. Each      node is represented as a pair of [val, random_index] where:


val: an integer representing Node.val

random_index: the index of the node (range from 0 to n-1) where random pointer points to, or null if it does not point to any node.

 

題意給定一個鍊表,每個節點包含一個額外增加的隨機指針,該指針可以指向鍊表中的任何節點或空節點。我們用一個由 n 個節點組成的鍊表來表示輸入/輸出中的鍊表。每個節點用一個 [val, random_index] 表示:random_index:隨機指針指向的節點索引(範圍從 0 到 n-1);如果不指向任何節點,則為  null 。


解題遍歷第一遍鍊表,我們不考慮鍊表之間的相互關係,僅僅生成所有節點,然後把它存到 HashMap 中,val 作為 key,Node 作為 value。遍歷第二遍鍊表,將之前生成的節點取出來,更新它們的 next 和 random 指針。


public Node copyRandomList(Node head) {
    if (head == null) {
        return null;
    }
    HashMap<Node, Node> map = new HashMap<>();
    Node h = head;
    while (h != null) {
        Node t = new Node(h.val);
        map.put(h, t);
        h = h.next;
    }
    h = head;
    while (h != null) {
        if (h.next != null) {
            map.get(h).next = map.get(h.next);
        }
        if (h.random != null) {
            map.get(h).random = map.get(h.random);
        }
        h = h.next;
    }
    return map.get(head);
}

好了,今天的文章就到這裡,如果覺得有所收穫,請順手點個在看或者轉發吧,你們的支持是我最大的動力。

相關焦點

  • ​LeetCode刷題實戰148:排序鍊表
    所以,為了提高大家的算法能力,這個公眾號後續每天帶大家做一道算法題,題目就從LeetCode上面選 !今天和大家聊的問題叫做 排序鍊表,我們先來看題面:https://leetcode-cn.com/problems/sort-list/Given the head of a linked list, return the list after sorting it in ascending order.
  • LeetCode 例題精講 | 05 雙指針*鍊表問題:快慢指針
    這篇文章將會包含:快慢指針的案例講解:尋找鍊表中點、尋找鍊表的倒數第 k 個元素鍊表問題中的雙指針 我們知道,鍊表數據類型的特點決定了它只能單向順序訪問,而不能逆向遍歷或隨機訪問(按下標訪問)。很多時候,我們需要使用快慢指針的技巧來實現一定程序的逆向遍歷,或者減少遍歷的次數。
  • Leetcode刷題-鍊表
    鍊表中倒數第k個節點難度:簡單輸入一個鍊表,輸出該鍊表中倒數第k個節點。為了符合大多數人的習慣,本題從1開始計數,即鍊表的尾節點是倒數第1個節點。例如,一個鍊表有6個節點,從頭節點開始,它們的值依次是1、2、3、4、5、6。這個鍊表的倒數第3個節點是值為4的節點。
  • ​LeetCode刷題實戰25:K 個一組翻轉鍊表
    所以,為了提高大家的算法能力,這個公眾號後續每天帶大家做一道算法題,題目就從LeetCode上面選 !今天和大家聊的問題叫做K 個一組翻轉鍊表,我們先來看題面:https://leetcode-cn.com/problems/reverse-nodes-in-k-groupGiven a linked list, reverse the nodes of a linked list k at a time and return its
  • 春節大禮包|刷題技巧+80道Leetcode
    為了跳槽,我前兩年的春節都是在刷題中度過的,目前為止刷了小四百道leetcode,也算是有一些經驗,今天就跟大家分享下學習方法和我總結的乾貨。如何找到感覺講起算法,我看過不少書,有《算法導論》、《算法第四版》、《算法競賽入門經典》、《劍指Offer》,但都沒有讓我產生質變,現在回想原因可能是:看書的時候著急,不過腦子直接看解析,也不記筆記,過幾天就忘了看完書就覺得自己會了,直接 Leetcode 隨機選題,還是不會,內心受挫就不想刷了
  • Anki實戰-刷leetcode之「141-環形鍊表」
    有同學說自己刷leetcode的時候每次刷完就忘,忘了再刷。
  • ​LeetCode刷題實戰23:合併K個升序鍊表
    所以,為了提高大家的算法能力,這個公眾號後續每天帶大家做一道算法題,題目就從LeetCode上面選 !今天和大家聊的問題叫做合併K個升序鍊表,我們先來看題面:https://leetcode-cn.com/problems/merge-k-sorted-lists/Given an array of linked-lists lists, each linked list is sorted in ascending order.Merge
  • 一次搞定面試中的鍊表問題
    之前寫過一篇關於鍊表的文章,今天補上一些leetcode上鍊表相關的題目,繼續匯總鍊表相關的問題,也希望可以為找工作的同學們提供一點幫助。如何解除環單鍊表大數求和複製帶隨機指針的鍊表leetcode上也有很多鍊表題:https://leetcode.com/problems/reverse-linked-list/https://leetcode.com/problems/swap-nodes-in-pairs/description/https
  • leetcode刷題最強指南(版本1.0)
    為什麼會有這篇刷題指南很多剛開始刷題的同學都有一個困惑:面對leetcode上近兩千道題目,從何刷起
  • 帶你狂刷算法Leetcode題!短時間內快速獲得實戰能力!
    但對於初學者來說,很容易沉迷在刷題的數量中,覺得如果能刷完這1000道題,自己一定能夠有所飛躍。但實際上,低效率的重複對你來說,根本就無法掌握到解題的精髓,一旦題目有所變動,就無法舉一反三。那究竟應該怎麼刷題才高效呢?
  • 合併兩個有序鍊表 | Leetcode題解
    題目描述將兩個升序鍊表合併為一個新的升序鍊表並返回。新鍊表是通過拼接給定的兩個鍊表的所有節點組成的。 示例:輸入:1->2->4, 1->3->4輸出:1->1->2->3->4->4標籤公司公司思路本題可以使用遞歸來解,將兩個鍊表頭部較小的一個與剩下的元素合併,並返回排好序的鍊表頭,當兩條鍊表中的一條為空時終止遞歸。
  • 每天一道leetcode61-旋轉鍊表
    正當班主任要繼續發話,只聽到角落默默想起來一個聲音:」K2」前言 2018.11.21號打卡今天的題目leetcode26:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/description/昨天的題解題目 每天一道leetcode61
  • ​LeetCode刷題實戰18: 四數之和
    所以,為了提高大家的算法能力,這個公眾號後續每天帶大家做一道算法題,題目就從LeetCode上面選 !今天和大家聊的問題叫做四數之和 ,我們先來看題面:https://leetcode-cn.com/problems/4sum/Given an array nums of n integers and an integer target, are there elements a, b, c, and d in nums such
  • 一個月帶你狂刷算法Leetcode題,衝刺最後秋招!
    但你可能又會覺得《百面機器學習》這本書又很難,而leetcode題量太大,如何抓住重點,高效得在短期內進行突擊?就是針對即將開始的秋招和社招所建立的,我們找尋了在面試經驗非常豐富的導師團來進行帶學對書籍重難點內容提供針對性視頻講解,對leetcode刷題進行重難點視頻講解1、以《百面機器學習》為教材,結合leetcode篩選刷題2、利用一線發開中最實際的問題為主,包含熱點和常考問題
  • 通關LeetCode刷題完整攻略,省時又高效
    Pattern: two points, 雙指針類型雙指針是這樣的模式:兩個指針朝著左右方向移動(雙指針分為同向雙指針和異向雙指針),直到他們有一個或是兩個都滿足某種條件。雙指針通常用在排好序的數組或是鍊表中尋找對子。比如,你需要去比較數組中每個元素和其他元素的關係時,你就需要用到雙指針了。
  • leetcode刷對了麼
    今天,逆行君就帶你從世界觀和方法論兩方面走進「leetcode」 leetcode之世界觀 什麼是leetcode 簡單來說,leetcode是一個美國的在線編程網站,它收集了各大公司的經典算法面試題,用戶可以選擇不同的語言進行代碼的在線編寫、編譯和調試。
  • LeetCode每日一題:填充每個節點的下一個右側節點指針
    另外代碼和題解也可以從我的github找到::https://github.com/liuzhidanhhh/LeetCodeSolution題目LeetCode117:填充每個節點的下一個右側節點指針 II連結:https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node-ii
  • LeetCode刷題第三周【數組(簡單)】
    日期Oct.28 - Nov.03 2020(每日一題)Ps:本周我們接著上一周繼續刷數組,難度依舊是簡單,題目不再按順序,而是隨機挑選,下周開始會加深難度。隨著學校的開課,我會將平時上課的內容和筆記也整理成MK的格式上傳。
  • ​LeetCode刷題實戰139:單詞拆分
    所以,為了提高大家的算法能力,這個公眾號後續每天帶大家做一道算法題,題目就從LeetCode上面選 !今天和大家聊的問題叫做 單詞拆分,我們先來看題面:https://leetcode-cn.com/problems/word-break/Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, determine if s can be
  • 如何科學的刷 Leetcode
    我的方法觀裡,有三個重要的點,分別是:•找到科學的刷題順序•學習優秀的解題方案•及時整理題目的套路找到科學的刷題順序目前 Leetcode 收錄的算題題目,超過了一千道,數量非常之多。同學們也都是很有想法的人,於是,八仙過海,各有各的姿勢。