非递归:
/**
* 用一个遍历来装排好序的链表,和一个遍历记录最其实的位置。
* @param l1
* @param l2
* @return
*/
public static ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode result = null;
ListNode start = null;
if (l1.val < l2.val) {
result = l1;
l1 = l1.next;
} else {
result = l2;
l2 = l2.next;
}
start = result;
while (l1 != null && l2 != null) {
if (l1.val < l2.val) {
result.next = l1;
result = l1;
l1 = l1.next;
} else {
result.next = l2;
result = l2;
l2 = l2.next;
}
}
if (l1 == null) {
result.next = l2;
} else {
result.next = l1;
}
return start;
}
递归:
public static ListNode mergeTwoListsRecursion(ListNode l1, ListNode l2) {
if(l1==null){
return l2;
}
if(l2==null){
return l1;
}
if(l1.val<=l2.val){
ListNode next = l1.next; //先把l1的next拿出来与l2做合并
ListNode listNode = mergeTwoListsRecursion(next, l2);
l1.next=listNode; //把l1指向合并完的结果。
return l1;
}else {
ListNode next = l2.next;
ListNode listNode = mergeTwoListsRecursion(l1, next);
l2.next=listNode;
return l2;
}
}
1->3
2->4
参考资料:https://leetcode-cn.com/problems/merge-two-sorted-lists/submissions/
官方答案:
public static ListNode mergeTwoLists2(ListNode l1, ListNode l2) {
// 类似归并排序中的合并过程
ListNode dummyHead = new ListNode(0);
ListNode cur = dummyHead;
while (l1 != null && l2 != null) {
if (l1.val < l2.val) {
cur.next = l1;
cur = cur.next;
l1 = l1.next;
} else {
cur.next = l2;
cur = cur.next;
l2 = l2.next;
}
}
// 任一为空,直接连接另一条链表
if (l1 == null) {
cur.next = l2;
} else {
cur.next = l1;
}
return dummyHead.next;
}