Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.
1. iterative implementation
Analysis: Use the list which contains the smallest element as the one "being merged" in this problem.
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1==null) return l2;
else if(l2==null) return l1;
ListNode sortedList = new ListNode(-1);
ListNode pre = null;
ListNode cur = null;
ListNode cur1 = null;
if(l1.val <= l2.val) {
sortedList.next = l1;
pre = l1;
cur = l1.next;
cur1 = l2;
}
else {
sortedList.next = l2;
pre = l2;
cur = l2.next;
cur1 = l1;
}
while(cur1 != null) {
if(cur == null) {
pre.next = cur1;
break;
}
if(cur.val > cur1.val) {
pre.next = cur1;
cur1 = cur1.next;
pre.next.next = cur;
}
else {
cur = cur.next;
}
pre = pre.next;
}
return sortedList.next;
}
}
2. recursive implementation
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1==null) return l2;
else if(l2==null) return l1;
ListNode result = null;
if(l1.val <= l2.val) {
result = l1;
result.next = mergeTwoLists(l1.next, l2);
}
else {
result = l2;
result.next = mergeTwoLists(l1, l2.next);
}
return result;
}
}