原题:#21_归并两个有序链表
- 迭代
- 新链表中允许重复结点存在
- 两个已有链表本身有序
- 不需要重新建立新链表
- 两两比较结点值的大小,较大的放到下一轮继续比较,较小的并入。
- 当短链表并入完成后,长链表剩下部分直接并入
- 时间复杂度:O(n+m)
- 空间复杂度:O(1)
public ListNode f(ListNode headA, ListNode headB) {
if (headA == null) {
return headB;
}
if (headB == null) {
return headA;
}
ListNode h1 = null;
ListNode h2 = h1; //将两条链表合并到h1中
while (headA != null && headB != null) {
if (headA.val < headB.val) {
h2.next = headA;
headA = headA.next;
} else {
h2.next = headB;
headB = headB.next;
}
h2 = h2.next;
}
h2.next = (headA == null) ? headB : headA;
return h1.next; //注意h1为哑节点
}
- 递归
- 结束条件:当某一链表为空时结束
- 递归操作:比较A节点与B节点的值的大小,若A节点的值较小,那么将A并入,并且让A的下一节点与B比较
- 返回值: 返回有序的一段链表
- 时间复杂度:O(n+m)
- 空间复杂度:O(n+m)
public ListNode f (ListNode headA, ListNdoe headB) {
if (headA == null)
return headB;
if (headB == null)
return headA;
if (headA.val < headB.val) {
headA.next = f(headA.next, headB);
return headA;
} else {
headB.next = f(headB.next, headA);
return headB;
}
}