合併兩個有序鏈表

非遞歸:

    /**
     * 用一個遍歷來裝排好序的鏈表,和一個遍歷記錄最其實的位置。
     * @param l1
     * @param l2
     * @return
     */

    public static ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode result = null;
        ListNode start = null;
        if (l1.val < l2.val) {
            result = l1;
            l1 = l1.next;
        } else {
            result = l2;
            l2 = l2.next;
        }
        start = result;
        while (l1 != null && l2 != null) {
            if (l1.val < l2.val) {
                result.next = l1;
                result = l1;
                l1 = l1.next;
            } else {
                result.next = l2;
                result = l2;
                l2 = l2.next;
            }
        }
        if (l1 == null) {
            result.next = l2;
        } else {
            result.next = l1;
        }
        return start;
    }

遞歸:

    public static ListNode mergeTwoListsRecursion(ListNode l1, ListNode l2) {
        if(l1==null){
            return l2;
        }
        if(l2==null){
            return l1;
        }
        if(l1.val<=l2.val){
            ListNode next = l1.next; //先把l1的next拿出來與l2做合併
            ListNode listNode = mergeTwoListsRecursion(next, l2);
            l1.next=listNode;  //把l1指向合併完的結果。
            return l1;
        }else {
            ListNode next = l2.next;
            ListNode listNode = mergeTwoListsRecursion(l1, next);
            l2.next=listNode;
            return l2;
        }
    }

1->3

2->4

參考資料:https://leetcode-cn.com/problems/merge-two-sorted-lists/submissions/

官方答案:

    public static ListNode mergeTwoLists2(ListNode l1, ListNode l2) {
        // 類似歸併排序中的合併過程
        ListNode dummyHead = new ListNode(0);
        ListNode cur = dummyHead;
        while (l1 != null && l2 != null) {
            if (l1.val < l2.val) {
                cur.next = l1;
                cur = cur.next;
                l1 = l1.next;
            } else {
                cur.next = l2;
                cur = cur.next;
                l2 = l2.next;
            }
        }
        // 任一爲空,直接連接另一條鏈表
        if (l1 == null) {
            cur.next = l2;
        } else {
            cur.next = l1;
        }
        return dummyHead.next;
    }

 

發佈了18 篇原創文章 · 獲贊 7 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章