https://leetcode.com/problems/merge-two-sorted-lists/
对于链表的题,一般而言都有两种解法,这题也不例外。
一个最容易想到的iteration(该题已经提炼到最好理解也使用的空间最小):
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null && l2 == null) return null;
if (l1 == null) return l2;
if (l2 == null) return l1;
ListNode head = new ListNode(); //head用来返回结果,防止edge case
ListNode handler = head; //本质上为当前插入位置的前一个节点
while(l2 != null && l1 != null) {
// 找到小的节点,l1小链接到当前handler节点之后的为l1,l2小则链接到当前节点的为l2
if (l1.val < l2.val) {
handler.next = l1;
l1 = l1.next;
} else {
handler.next = l2;
l2 = l2.next;
}
// 移动当前节点,保证handler总是当前插入位置的前一个节点
handler = handler.next;
}
// 遍历完一个链表,剩下的链表直接链接到handler之后
if (l1 == null) {
handler.next = l2;
} else if (l2 == null) {
handler.next = l1;
}
return head.next;
}
第二种方法为recursion,使用递归方式首先划分链表为当前节点(l1) + 左侧已经完成merge操作的链表,则两个链表的操作分解为当前节点的对比。如果l1 节点小于l2的节点值,则最终的链表中,小的节点在左侧。
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null && l2 == null) return null;
if (l1 == null) return l2;
if (l2 == null) return l1;
if (l1.val < l2.val) {
l1.next = mergeTwoLists(l1.next, l2);
return l1;
} else {
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}
}