题目描述
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例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。