原题如下:
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
我觉得解题思路用这一张图就可以表达的很清楚了。
我的代码(非递归的,递归的在下面)
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode Merge(ListNode list1,ListNode list2) {
if(list1 == null){
return list2;
}
if(list2 == null){
return list1;
}
ListNode cur1 = list1;
//list1的前驱
ListNode prev = null;
while(list1 != null&&list2 != null){
ListNode cur2 = list2;
while(list1 != null && list1.val<list2.val){
prev = list1;
list1 = list1.next;
}
if(list1 == null){
prev.next = list2;
return cur1;
}else{
list2 = list2.next;
if(prev == null){
cur2.next = cur1;
cur1 = cur2;
}else{
prev.next = cur2;
cur2.next = list1;
}
}
}
return cur1;
}
}
然后看到有大佬用递归写的,哇!猴赛雷啊。递归的思想很巧妙,而且代码量很少啊。
以下是递归代码
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;
}
}
递归跳出的条件,当比较到最后时,某一个链表为空,那另一个剩下的就可以直接“接”在之前已经比较好的那一串后面。
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;
}
这一些代码先比较每一个节点里的值的大小,小的值接在(他的next和另一个链表的当前较大的值相比较,其中的较小的值的前边)(这里有点绕),直到某一个链表为空,返回。