题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
思路
1.非递归式
①:遍历两个链表,先比较两个链表,将值小的节点赋值给合成链表的head,并且让cur指针指上去;
②: 继续遍历,进行cur指针的移动,拼接,如果有一个链表跑完,将另一个链表剩下直接挂到cur后面去即可;
2.递归式
①:list1小,就在list1后面添加list1.next和list2合并后的,最后返回list1
②:list2小,就在list2后面添加list2.next和list1合并后的,最后返回list2
代码实现
1. 非递归式
public ListNode Merge(ListNode list1,ListNode list2) {
//首先需要判断两个链表是否有Null
if(list1==null){
return list2;
}
if(list2==null){
return list1;
}
//表示合并之后的头结点
ListNode head = null;
//用于连接新节点,往后跑
ListNode cur = null;
//两个链表都往后跑
while(list1!=null && list2!=null){
if(list1.val<=list2.val){
if(head == null){
head = cur = list1;
}else{
cur.next = list1;
cur = list1;
}
list1=list1.next;
}else{
if(head == null){
head = cur = list2;
}else{
cur.next = list2;
cur=list2;
}
list2 = list2.next;
}
}
//将剩下的挂上去
if(list1!=null){
cur.next = list1;
}else{
cur.next = list2;
}
return head;
}
2. 递归式实现
public ListNode Merge(ListNode list1,ListNode list2) {
if(list1 == null){
return list2;
}
if(list2 == null){
return list1;
}
//list1小,就在list1后面添加list1.next和list2合并后的,最后返回list1
if(list1.val<=list2.val){
list1.next = Merge(list1.next,list2);
return list1;
}else{
//list2小,就在list2后面添加list2.next和list1合并后的,最后返回list2
list2.next = Merge(list1,list2.next);
return list2;
}
}