这道题重点掌握递归的用法!
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
示例1:
输入:1->2->3->4, 3->4->5
输出:1->2->3->3->4->4->5
非递归版本:
思路:
- 新建一个表head来保存合并后的表。head是头结点,如果list1.val<list2.val,将头结点head指向list1的值,反之,head指向list2的值
- 如果2个表中有个表挪到尾部了(null),就把剩下还有的那个表全部加到新链表里。
public ListNode Merge3(ListNode list1,ListNode list2) {
//新建一个头节点,用来存合并的链表。
ListNode head=new ListNode(-1);
head.next=null;
ListNode root=head;
while(list1!=null&&list2!=null){
if(list1.val<list2.val){
head.next=list1;
head=list1;
list1=list1.next;
}else{
head.next=list2;
head=list2;
list2=list2.next;
}
}
//把未结束的链表连接到合并后的链表尾部
if(list1!=null){
head.next=list1;
}
if(list2!=null){
head.next=list2;
}
return root.next;
}
递归版本:
思路:
例如:
表1:1>2>6>8
表2:5>8
- 当表1当前值 1< 表2当前值 5
- 表1的值1变成新链表的表头,这时需要比较1的next值和 表2的当前值5,相当于 1拿出去后,剩下两个链表的合并情况(子问题)。
- 返回 表1的值(新链表的头)
- 进入递归过程,比较 表1的next值 2 和 表2的当前值 5,有2<5
- 如上反复。
public ListNode Merge2(ListNode list1,ListNode list2) {
if(list1 == null){
return list2;
}
if(list2 == null){
return list1;
}
ListNode res=null;
if(list1.val <= list2.val){
res=list1;
list1.next = Merge2(list1.next, list2);
}else{
res=list2;
list2.next = Merge2(list1, list2.next);
}
return res;
}