【题目描述】
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
时间限制:1秒 空间限制:32768K 热度指数:446096
本题知识点: 链表
【解题思路】
递归版本:递归调用Merge()通过next连接就可以了;
非递归版本:注意处理头结点(定义两个结点,初始时两者都指向第一个结点处,last结点进行next操作构造链表,head结点在指向第一个结点后就不用动了)、等长部分以及多出来的部分,分情况处理。
// 递归版本15ms 9652K
public ListNode Merge(ListNode list1,ListNode list2) {
if(list1 == null && list2 == null)
return null;
else if(list1 == null && list2 != null)
return list2;
else if(list1 != null && list2 == null)
return list1;
ListNode mergedList = null;
if(list1.val <= list2.val){
mergedList = list1;
mergedList.next = Merge(list1.next, list2);
} else {
mergedList = list2;
mergedList.next = Merge(list1, list2.next);
}
return mergedList;
}
// 非递归版本 22ms 9536K
public ListNode Merge(ListNode list1,ListNode list2) {
if(list1 == null)
return list2;
if(list2 == null)
return list1;
ListNode head = null;
ListNode last = null;
// 处理头结点
if(list1.val <= list2.val){
head = last = list1;
list1 = list1.next;
} else {
head = last = list2;
list2 = list2.next;
}
// 处理等长部分
while(list1 != null && list2 != null){
if(list1.val <= list2.val){
last.next = list1;
list1 = list1.next;
} else{
last.next = list2;
list2 = list2.next;
}
last = last.next;
}
// 处理多出来的部分
if(list1 == null)
last.next = list2;
else if(list2 == null)
last.next = list1;
return head;
}