算法修煉之路——【鏈表】Leetcode 21合併兩個有序鏈表

題目描述

將兩個升序鏈表合併爲一個新的升序鏈表並返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。

示例1:

輸入: listA= [1, 2, 4], listB = [1, 3, 4]
輸出: [1, 1, 2, 3, 4, 4]

思路分析

這道題目爲簡單難度,我們可以設置一哨兵節點dummyHead,兩個遍歷鏈表的指針pA, pB與一個排序部分的尾節點指針tmpTail方便節點的插入。

解題步驟

  1. 初始化兩個分區指針pA, pB和哨兵節點dummyHead,及返回鏈表的尾節點指針tmpTail
  2. 遍歷原始鏈表,判斷pA.val, pB.val的大小關係,較小方接入tmpTail.next
  3. pA, pB任一指針爲null時,停止遍歷;最後判斷是否存在未遍歷部分,直接接入tmpTail.next.
  4. 返回哨兵節點後置節點

解題代碼

    public static ListNode solution(ListNode listA, ListNode listB) {
        if (listA == null) {
            return listB;
        }
        if (listB == null) {
            return listA;
        }

        /* Step1: Init. pointers */
        ListNode dummyHead = new ListNode(0);
        ListNode pA = listA;
        ListNode pB = listB;
        ListNode tmpTail = dummyHead;
        
        /* Step2: go through the head-list
        and
        compare pA.next.val and pB.val
         */
        while (pA != null && pB != null) {
            if(pA.val < pB.val){
                tmpTail.next = pA;
                pA = pA.next;
            }else{
                tmpTail.next = pB;
                pB = pB.next;
            }
            tmpTail = tmpTail.next;
        }
        
        // Step3: connect subsequent if exists
        tmpTail.next = pA == null ? pB : pA;
        /* Step4: return  */
        return dummyHead.next;
    }

複雜度分析

不妨設兩個鏈表的長度分別爲m, n:

時間複雜度:我們對兩個原始鏈表進行了一次遍歷,容易理解時間複雜度爲O(m + n);
空間複雜度:我們這裏沒有設置輔助容器,故空間複雜度爲O(1).

GitHub源碼

完整可運行文件請訪問GitHub

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章