算法學(xué)習(xí)筆記之初級鏈表

記錄一下最近刷的比較有意思的題

1. 環(huán)形鏈表

給定一個鏈表宠能,判斷鏈表中是否有環(huán)淆院。

進階

你能否不使用額外空間解決此題薄风?

我的思路與解答(1ms):

首先理解環(huán)形鏈表的概念牢贸,我開始以為只有一種竹观,就是頭尾相連的鏈表就是環(huán)形鏈表,如下圖岳遥;


圖1

但其實還有一種比較特殊一點的環(huán)形鏈表题诵,如下圖策吠;


圖2
/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
class Solution {
    public boolean hasCycle(ListNode head) {
        if(head == null) return false;
        /** 
        *  主要思路:用雙指針解法,slow和fast誊抛,都從頭部開始
        *  slow每次走一步,fast每次走兩步
        *  這樣不論是頭尾相連的環(huán)形鏈表還是特殊的環(huán)形鏈表
        *  在若干步后slow和fast會相遇
        */
        ListNode slow = head;
        ListNode fast = head;
        while(fast.next != null){
            slow = slow.next;
            fast = fast.next;
            if(fast.next != null){
                fast = fast.next;
            }else{
                return false;
            }
            if(slow.equals(fast)){
                return true;
            }
        }
        return false;
    }
}

小結(jié):

一開始只想到了頭尾相連的鏈表整陌,去搜索了相關(guān)概念后才知道原來還有另一種拗窃,但是這題做起來思路還是比較明確。

2. 合并兩個有序鏈表

將兩個有序鏈表合并為一個新的有序鏈表并返回泌辫。新鏈表是通過拼接給定的兩個鏈表的所有節(jié)點組成的随夸。

示例:

輸入: 1->2->4, 1->3->4
輸出: 1->1->2->3->4->4

我的思路與解答(11 ms):

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if(l1 == null && l2 == null) return null;
        if(l1 == null) return l2;
        if(l2 == null) return l1;
        ListNode head;
        ListNode p1;
        ListNode p2;
        ListNode temp;
        
        // 首先對比兩個鏈表頭部的值的大小,小的鏈表為最終返回的鏈表震放,即將頭部大的拆開插入小的鏈表
        if(l1.val <= l2.val){
            head = l1;
            p1 = l1;
            p2 = l2;
        }else{
            head = l2;
            p1 = l2;
            p2 = l1;
        }
        
        /**
        *  進入循環(huán)宾毒,當判斷p2指向的結(jié)點的值大于等于p1所指向且小于p1的下個結(jié)點的值時
        *  將p2所指向的結(jié)點插到p1之后,并將p1指向被插入的結(jié)點
        *  當p1或p2為最后一個結(jié)點時跳出循環(huán)
        */ 
        while(p1.next != null && p2.next != null){
            if(p2.val >= p1.val) {
                if(p1.next.val > p2.val) {
                    temp = p1.next;
                    p1.next = p2;
                    l2 = p2.next;
                    p2.next = temp;
                    p1 = p2;
                    p2 = l2;
                    continue;
                }
                p1 = p1.next;
            }
        }
        
        /**
        *  這時會有兩張情況:
        *  1. p2為最后一個結(jié)點殿遂,只需再進行一次循環(huán)诈铛,將p2插入鏈表
        *  2. p1為最后一個結(jié)點邪锌,說明鏈表的最大的值都沒有比p2所指向的結(jié)點的值大,只需將p2插到鏈表的最后即可
        *     因為這時p1指向的是最后一個結(jié)點癌瘾,所以直接 p1.next = p2 即可
        */
        if(p2.next == null){
            while(p1.next != null){
                if(p2.val >= p1.val){
                    if(p1.next.val > p2.val) {
                        temp = p1.next;
                        p1.next = p2;
                        l2 = p2.next;
                        p2.next = temp;
                        p1 = p2;
                        p2 = l2;
                        return head;
                    }
                    p1 = p1.next;
                }
            }
        }
        
        if(p1.next == null){
            p1.next = p2;
        }
        
        return head;
        
    }
}

小結(jié):

這題第一次做的時候思路很亂觅丰,做了一個晚上都沒做出來,第二天再做的時候理清思路10分鐘就做出來了妨退,事實證明做題思路很重要

3. 總結(jié)

鏈表類的題目尤其需要思路明確妇萄,有一點錯誤就容易發(fā)生空指針異常。

本文作者:RoNnx
博客鏈接:http://ronnx.top/2018/06/17/20180004/
版權(quán)聲明:本作品采用「知識共享署名-非商業(yè)性使用-相同方式共享 4.0 國際許可協(xié)議 進行許可」,轉(zhuǎn)載請注明出處咬荷!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末冠句,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子幸乒,更是在濱河造成了極大的恐慌懦底,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件罕扎,死亡現(xiàn)場離奇詭異聚唐,居然都是意外死亡,警方通過查閱死者的電腦和手機腔召,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門杆查,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人臀蛛,你說我怎么就攤上這事亲桦。” “怎么了浊仆?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵客峭,是天一觀的道長。 經(jīng)常有香客問我抡柿,道長舔琅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任沙绝,我火速辦了婚禮搏明,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘闪檬。我一直安慰自己星著,他們只是感情好,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布粗悯。 她就那樣靜靜地躺著虚循,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上横缔,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天铺遂,我揣著相機與錄音,去河邊找鬼茎刚。 笑死襟锐,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的膛锭。 我是一名探鬼主播粮坞,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼初狰!你這毒婦竟也來了莫杈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤奢入,失蹤者是張志新(化名)和其女友劉穎筝闹,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體腥光,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡关顷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了柴我。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片解寝。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡扩然,死狀恐怖艘儒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情夫偶,我是刑警寧澤界睁,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站兵拢,受9級特大地震影響翻斟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜说铃,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一访惜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧腻扇,春花似錦债热、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春墙杯,著一層夾襖步出監(jiān)牢的瞬間配并,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工高镐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留溉旋,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓嫉髓,卻偏偏與公主長得像低滩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子岩喷,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 搞懂單鏈表常見面試題 Hello 繼上次的 搞懂基本排序算法恕沫,這個一星期,我總結(jié)了纱意,我所學(xué)習(xí)和思考的單鏈表基礎(chǔ)知識...
    醒著的碼者閱讀 4,587評論 1 45
  • 鏈表刪除[203] Remove Linked List Elements[19] Remove Nth Node...
    野狗子嗷嗷嗷閱讀 6,297評論 4 35
  • (一)LeetCode206.反轉(zhuǎn)鏈表 題目描述: 反轉(zhuǎn)一個單鏈表婶溯。 代碼實現(xiàn) (二)LeetCode160. 相...
    Jarily閱讀 1,410評論 0 5
  • 轉(zhuǎn)載請注明出處:http://www.reibang.com/p/c65d9d753c31 在上一篇博客《數(shù)據(jù)結(jié)構(gòu)...
    Alent閱讀 3,508評論 4 74
  • (這是一篇小學(xué)生的流水賬作文 啊哈哈 慎點) 直到4月底迄委,實習(xí)生活的煩悶讓我決定再次拎起腳步向向往已久的地方出發(fā)—...
    北巷子貓閱讀 506評論 0 1