25:合并兩個排序的鏈表

題目25:合并兩個排序的鏈表

輸入兩個遞增排序的鏈表,合并這兩個鏈表并使新鏈表中的結(jié)點(diǎn)仍然是按照遞增排序的

舉例說明

鏈表1:10 -> 30 -> 50 -> 70债蓝;鏈表2:20 -> 40 -> 60 -> 80
合并后的鏈表為:10 -> 20 -> 30 -> 40 -> 50 -> 60 -> 70 -> 80

思路

幾個點(diǎn)

  • 選擇好 合并后鏈表的頭
  • 每次相當(dāng)于從一個老鏈表斷開(用.next后移)壳鹤,接在新鏈表上(為.next賦值)

一. 遞歸

每次以兩個鏈表頭節(jié)點(diǎn)中的小值作為合并鏈表的下一個節(jié)點(diǎn)。每次合并的操作都是相同的饰迹,故使用遞歸芳誓。

主體代碼

    public static ListNode merge1(ListNode head1, ListNode head2) {//遞歸
        if (head1 == null) {
            return head2;
        }
        if (head2 == null) {
            return head1;
        }   

        ListNode tmp = head1;//兩個鏈表中頭部較小的結(jié)點(diǎn) 是 新鏈表的頭
        if (tmp.value < head2.value) {
            tmp.next = merge1(head1.next, head2);
        } else {
            tmp = head2;
            tmp.next = merge1(head1, head2.next);
        }
        return tmp;
    }

二. 迭代

主體代碼

    public static ListNode merge2(ListNode head1, ListNode head2) {//迭代
        if (head1 == null) {
            return head2;
        }
        if (head2 == null) {
            return head1;
        }   
        ListNode root = new ListNode();//邏輯頭結(jié)點(diǎn)
        ListNode cur = root;// 待處理節(jié)點(diǎn)讯嫂,每次都是正在合并后鏈表的尾,迭代向后

        while (head1 != null && head2 != null) {// 當(dāng)兩個鏈表都不為空就進(jìn)行合并操作
            if (head1.value < head2.value) {
                cur.next = head1;//老鏈表節(jié)點(diǎn) 加入新鏈表(接上鏈子)
                head1 = head1.next;//老鏈表中 待處理節(jié)點(diǎn)后移(在老鏈表移除處理過的 節(jié)點(diǎn))
            } else {
                cur.next = head2;
                head2 = head2.next;
            }
            cur = cur.next;//新鏈表中 待處理指針后移兆沙,方便下次添加
        }
        // 下面的兩個if有且只一個if會內(nèi)的內(nèi)容會執(zhí)行
        if (head1 != null) {// 如果第一個鏈表的元素未處理完將其
            cur.next = head1;//接到合并鏈表的最后一個結(jié)點(diǎn)之后
        }
        if (head2 != null) {
            cur.next = head2;
        }
        return root.next;//root是邏輯頭結(jié)點(diǎn) 欧芽;root.next是合并后的鏈表頭
    }

總的代碼含測試

public class _25 {
    private static class ListNode {
        int value;
        ListNode next;

        public ListNode() {
        }
        public ListNode(int value) {
            this.value = value;
        }
    }
    
    public static ListNode merge1(ListNode head1, ListNode head2) {//遞歸
        if (head1 == null) {
            return head2;
        }
        if (head2 == null) {
            return head1;
        }   

        ListNode tmp = head1;//兩個鏈表中頭部較小的結(jié)點(diǎn) 是 新鏈表的頭
        if (tmp.value < head2.value) {
            tmp.next = merge1(head1.next, head2);
        } else {
            tmp = head2;
            tmp.next = merge1(head1, head2.next);
        }
        return tmp;
    }

    public static ListNode merge2(ListNode head1, ListNode head2) {//迭代
        if (head1 == null) {
            return head2;
        }
        if (head2 == null) {
            return head1;
        }   
        ListNode root = new ListNode();//邏輯頭結(jié)點(diǎn)
        ListNode cur = root;// 待處理節(jié)點(diǎn),每次都是正在合并后鏈表的尾葛圃,迭代向后

        while (head1 != null && head2 != null) {// 當(dāng)兩個鏈表都不為空就進(jìn)行合并操作
            if (head1.value < head2.value) {
                cur.next = head1;//老鏈表節(jié)點(diǎn) 加入新鏈表(接上鏈子)
                head1 = head1.next;//老鏈表中 待處理節(jié)點(diǎn)后移(在老鏈表移除處理過的 節(jié)點(diǎn))
            } else {
                cur.next = head2;
                head2 = head2.next;
            }
            cur = cur.next;//新鏈表中 待處理指針后移千扔,方便下次添加
        }
        // 下面的兩個if有且只一個if會內(nèi)的內(nèi)容會執(zhí)行
        if (head1 != null) {// 如果第一個鏈表的元素未處理完將其
            cur.next = head1;//接到合并鏈表的最后一個結(jié)點(diǎn)之后
        }
        if (head2 != null) {
            cur.next = head2;
        }
        return root.next;//root是邏輯頭結(jié)點(diǎn) ;root.next是合并后的鏈表頭
    }
    //for test
    public static void printList(ListNode head) {
        while (head != null) {
            System.out.print(head.value + " -> ");
            head = head.next;
        }
        System.out.println("null");
    }
    public static void main(String[] args) {
        // 10 -> 30 -> 50 -> 70
        ListNode head1 = new ListNode(10);
        ListNode n2 = new ListNode(30);
        ListNode n3 = new ListNode(50);
        ListNode n4 = new ListNode(70);
        head1.next = n2;
        n2.next = n3;
        n3.next = n4;
        // 20 -> 40 -> 60 -> 80
        ListNode head2 = new ListNode(20);
        ListNode n5 = new ListNode(40);
        ListNode n6 = new ListNode(60);
        ListNode n7 = new ListNode(80);
        head2.next = n5;
        n5.next = n6;
        n6.next = n7;

        System.out.print("原始鏈表1:");
        printList(head1);
        System.out.print("原始鏈表2:");
        printList(head2);
        System.out.print("合并后的鏈表:");
        //head = merge1(head, head2);
        head1 = merge2(head1, head2);
        printList(head1);
    }
}

輸出:

原始鏈表1:10->30->50->70->null
原始鏈表2:20->40->60->80->null
合并后的鏈表:10->20->30->40->50->60->70->80->null
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末库正,一起剝皮案震驚了整個濱河市曲楚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌褥符,老刑警劉巖龙誊,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異喷楣,居然都是意外死亡趟大,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門铣焊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逊朽,“玉大人,你說我怎么就攤上這事曲伊∵椿洌” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵坟募,是天一觀的道長岛蚤。 經(jīng)常有香客問我,道長懈糯,這世上最難降的妖魔是什么涤妒? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮昂利,結(jié)果婚禮上届腐,老公的妹妹穿的比我還像新娘。我一直安慰自己蜂奸,他們只是感情好犁苏,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著扩所,像睡著了一般围详。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天助赞,我揣著相機(jī)與錄音买羞,去河邊找鬼。 笑死雹食,一個胖子當(dāng)著我的面吹牛畜普,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播群叶,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼吃挑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了街立?” 一聲冷哼從身側(cè)響起舶衬,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赎离,沒想到半個月后逛犹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡梁剔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年虽画,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片憾朴。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡狸捕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出众雷,到底是詐尸還是另有隱情,我是刑警寧澤做祝,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布砾省,位于F島的核電站,受9級特大地震影響混槐,放射性物質(zhì)發(fā)生泄漏编兄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一声登、第九天 我趴在偏房一處隱蔽的房頂上張望狠鸳。 院中可真熱鬧,春花似錦悯嗓、人聲如沸件舵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铅祸。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間临梗,已是汗流浹背涡扼。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留盟庞,地道東北人吃沪。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像什猖,于是被迫代替她去往敵國和親票彪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

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