一般的写法:
public class Solution {
public ListNode Merge(ListNode list1,ListNode list2) {
ListNode head = new ListNode(-1);
ListNode p = head;
while(list1 != null && list2 != null){
if(list1.val <= list2.val){
p.next = new ListNode(list1.val);
list1 = list1.next;
}else{
p.next = new ListNode(list2.val);
list2 = list2.next;
}
p = p.next;
}
if(list1 == null){
while(list2 != null){
p.next = new ListNode(list2.val);
list2 = list2.next;
p = p.next;
}
}
if(list2 == null){
while(list1 != null){
p.next = new ListNode(list1.val);
list1 = list1.next;
p = p.next;
}
}
p.next = null;
return head.next;
}
}
但是,我这样并不是一个好答案,因为我每一次都进行了new的操作,浪费了大量的空间!进行简化后,代码如下:
public class Solution {
public ListNode Merge(ListNode list1,ListNode list2) {
ListNode head = new ListNode(-1);
ListNode p = head;
while(list1 != null && list2 != null){
if(list1.val <= list2.val){
p.next = list1;//这里可以直接进行赋值的
list1 = list1.next;
}else{
p.next = list2;
list2 = list2.next;
}
p = p.next;
}
if(list1 == null){//链表是包括当前结点到最后的所有结点
p.next = list2;
}
if(list2 == null){
p.next = list1;
}
return head.next;
}
}
2、递归的写法
public class Solution {
ListNode p = null;
public ListNode Merge(ListNode list1,ListNode list2) {
if(list1 == null)
return list2;
if(list2 == null)
return list1;
if(list1.val <= list2.val){
ListNode head = list1;
p = head;
p.next = Merge(list1.next,list2);
return head;
}else{
ListNode head = list2;
p = head;
p.next = Merge(list1,list2.next);
return head;
}
}
}
这个递归需要仔细观察一下,在这个递归函数中不能使用全局变量head!
改良后:
public class Solution {
public ListNode Merge(ListNode list1,ListNode list2) {
if(list1 == null)
return list2;
if(list2 == null)
return list1;
if(list1.val <= list2.val){
list1.next = Merge(list1.next,list2);
return list1;
}else{
list2.next = Merge(list1,list2.next);
return list2;
}
}
}