1. 程式人生 > >Leetcode演算法Java全解答--21. 合併兩個有序連結串列

Leetcode演算法Java全解答--21. 合併兩個有序連結串列

Leetcode演算法Java全解答–21. 合併兩個有序連結串列

文章目錄

題目

將兩個有序連結串列合併為一個新的有序連結串列並返回。新連結串列是通過拼接給定的兩個連結串列的所有節點組成的。

示例:

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

想法

宣告結果連結串列C,同時遍歷2個連結串列A和B,

比對2個連結串列當前值的資料大小,

如果A比B小,就往結果連結串列C中賦值,然後A連結串列往前走

反之則B連結串列往前走

複雜度n/n

結果

超過99%的測試案例

複雜度n/n

總結

程式碼

我的答案

       /**************************************
     * 題目
     * 將兩個有序連結串列合併為一個新的有序連結串列並返回。新連結串列是通過拼接給定的兩個連結串列的所有節點組成的。
     *
     * 示例:
     *
     * 輸入:1->2->4, 1->3->4
     * 輸出:1->1->2->3->4->4
     **************************************/

    /**************************************
     *
     * 想法:
     *
     *      宣告結果連結串列C,同時遍歷2個連結串列A和B,
     *      比對2個連結串列當前值的資料大小,
     *      如果A比B小,就往結果連結串列C中賦值,然後A連結串列往前走
     *      反之則B連結串列往前走
     *
     *
     * 我的做法
     * 超過99%的測試案例
     *
     * ***********************************/
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if (l1 == null) {
            return l2;
        }
        if (l2 == null) {
            return l1;
        }

        ListNode result = new ListNode(0);

        ListNode cur = result;
        ListNode cur1 = l1;
        ListNode cur2 = l2;

        if (cur1.val < cur2.val) {
            cur.val = cur1.val;
            cur1 = cur1.next;
        } else {
            cur.val = cur2.val;
            cur2 = cur2.next;
        }

        while (cur1 != null || cur2 != null) {
            if (cur1 == null) {
                cur.next = cur2;
                return result;
            }
            if (cur2 == null) {
                cur.next = cur1;
                return result;
            }

            if (cur1.val < cur2.val) {
                cur.next = cur1;
                cur1 = cur1.next;
            } else {
                cur.next = cur2;
                cur2 = cur2.next;
            }
            cur = cur.next;
        }

        return result;
    }

大佬們的答案


    public ListNode better(ListNode l1, ListNode l2) {
        ListNode result = new ListNode(0);
        ListNode tmp = result;
        while (l1 != null && l2 != null) {
            if (l1.val < l2.val) {
                tmp.next = l1;
                l1 = l1.next;
                tmp = tmp.next;
            } else {
                tmp.next = l2;
                l2 = l2.next;
                tmp = tmp.next;
            }
        }
        if (l1 == null) {
            tmp.next = l2;
        }
        if (l2 == null) {
            tmp.next = l1;
        }
        return result.next;
    }

測試用例

    @Test
    public void test021() {
        ListNode listNode11 = new ListNode(1);
        ListNode listNode12 = new ListNode(2);
        ListNode listNode13 = new ListNode(4);
        listNode11.next = listNode12;
        listNode12.next = listNode13;

        ListNode listNode21 = new ListNode(1);
        ListNode listNode22 = new ListNode(3);
        ListNode listNode23 = new ListNode(4);
        listNode21.next = listNode22;
        listNode22.next = listNode23;

        // 測試案例期望值
        ListNode expResult1 = new ListNode(1);
        ListNode expResult12 = new ListNode(1);
        ListNode expResult13 = new ListNode(2);
        ListNode expResult15 = new ListNode(3);
        ListNode expResult16 = new ListNode(4);
        ListNode expResult17 = new ListNode(4);
        expResult1.next = expResult12;
        expResult12.next = expResult13;
        expResult13.next = expResult15;
        expResult15.next = expResult16;
        expResult16.next = expResult17;

        Solution021 solution021 = new Solution021();

        ListNode result1 = solution021.mergeTwoLists(listNode11, listNode21);

        Assert.assertEquals(expResult1.toArray(), result1.toArray());
    }

其他

程式碼託管碼雲地址:https://gitee.com/lizhaoandroid/LeetCodeAll.git

檢視其他內容可以點選專欄或者我的部落格哈:https://blog.csdn.net/cmqwan

“大佬們的答案” 標籤來自leetcode,侵權請聯絡我進行刪改

如有疑問請聯絡,聯絡方式:QQ3060507060