題目描述
將兩個升序鏈表合併爲一個新的升序鏈表並返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。
示例1:
輸入: listA= [1, 2, 4], listB = [1, 3, 4]
輸出: [1, 1, 2, 3, 4, 4]
思路分析
這道題目爲簡單難度,我們可以設置一哨兵節點dummyHead
,兩個遍歷鏈表的指針pA, pB
與一個排序部分的尾節點指針tmpTail
方便節點的插入。
解題步驟
- 初始化兩個分區指針
pA, pB
和哨兵節點dummyHead
,及返回鏈表的尾節點指針tmpTail
; - 遍歷原始鏈表,判斷
pA.val, pB.val
的大小關係,較小方接入tmpTail.next
- 當
pA, pB
任一指針爲null
時,停止遍歷;最後判斷是否存在未遍歷部分,直接接入tmpTail.next
. - 返回哨兵節點後置節點
解題代碼
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。