题目
将两个排序链表合并为一个新的排序链表
样例
给出 1->3->8->11->15->null,2->null, 返回 1->2->3->8->11->15->null。
public class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
this.next = null;
}
}
思路
- 如果两个链表任一为空,则返回另一个。如果都为空,直接返回空。
- 定义一个新链表,用于存储合并后的链表。
- 比较两个链表,把其中链表值较小的存入新链表中,链表后移。
- 如果其中一个链表已经移到到链表末尾,则将另一个链表剩余的部分直接存储到新链表。
- 返回新链表。
- 因为本题没有时间与空间限制,所以递归与非递归都可以顺利通过。
递归实现
public ListNode mergeTwoLists1(ListNode l1, ListNode l2) {
if (l1 == null) return l2;
if (l2 == null) return l1;
ListNode node = null;
if (l1.val < l2.val) {
node = l1;
node.next = mergeTwoLists(l1.next, l2);
} else {
node = l2;
node.next = mergeTwoLists(l1, l2.next);
}
return node;
}
非递归
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null) return l2;
if (l2 == null) return l1;
ListNode newNode = new ListNode(-1);
ListNode node = newNode;
while (l1 != null && l2 != null) {
if (l1.val < l2.val) {
node.next = l1;
l1 = l1.next;
} else {
node.next = l2;
l2 = l2.next;
}
node = node.next;
}
if (l1 != null) {
node.next = l1;
}
if (l2 != null) {
node.next = l2;
}
return newNode.next;
}