输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
合并两个排序的链表,并且使新的链表是排序的
递归的方式
递归出口是 head1 为 null 或 head2 为 null, 此时直接返回对方。
public static Node merge(Node head1, Node head2) {
if (head1 == null)
return head2;
if (head2 == null)
return head1;
Node mergeHead = null;
if (head1.val <= head2.val) {
mergeHead = head1;
mergeHead.next = merge(head1.next, head2);
} else {
mergeHead = head2;
mergeHead.next = merge(head1, head2.next);
}
return mergeHead;
}
迭代
想到了归并排序中 merge 过程的那种结构,为了不单独处理首节点,简化代码中的逻辑,借助new Node(-1)的节点充当首节点
public static Node merge(Node list1, Node list2) {
Node head = new Node(-1);
Node curr = head;
while (list1 != null && list2 != null) {
if (list1.val <= list2.val) {
curr.next = list1;
curr = curr.next;
list1 = list1.next;
} else {
curr.next = list2;
curr = curr.next;
list2 = list2.next;
}
}
while (list1 != null) { //将链表list1依次添加
curr.next = list1;
list1 = list1.next;
curr = curr.next;
}
while (list2 != null) { //链表list2 依次添加
curr.next = list2;
list2 = list2.next;
curr = curr.next;
}
return head.next;
}