题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
思路:养成好习惯,一旦有链表作为形参传递,都要对链表是否为空做判断,防止空指针异常,至于怎么处理,稍后会讲。当链表都不为空时,比较两个链表的头结点值的大小,较小者作为新的头结点保存,(不妨设较小的头结点来自list1)然后list1的下一个结点作为list1的一个新的头结点与list2的头结点比较,…,像是一个递归操作。递归出口:当一个链表为空时结束,然后此时直接返回不为空的链表的剩下的结点(这里对链表为空的处理做了说明,即当list1为空时,返回list2;反之,返回list1)。
牛客网OJ代码如下:
public class Solution {
/*public static class ListNode{
int val;
ListNode next=null;
ListNode(int val){
this.val=val;
}
}*/
public static ListNode Merge(ListNode list1,ListNode list2) {
if(list1==null)
return list2;
else if(list2==null)
return list1;
ListNode pMergeHead=null;
if(list1.val<list2.val){
pMergeHead=list1;
pMergeHead.next=Merge(list1.next,list2);
}
else{
pMergeHead=list2;
pMergeHead.next=Merge(list1,list2.next);
}
return pMergeHead;
}
/*public static void printLsit(ListNode head){
ListNode pHead=head;
//System.out.print(pHead.next.val+" ");
while(pHead!=null){
System.out.print(pHead.val+" ");
pHead=pHead.next;
}
}
public static void main(String[] args){
List<ListNode> list=new ArrayList<ListNode>();
List<ListNode> list2=new ArrayList<ListNode>();
list.add(new ListNode(1));
list.add(new ListNode(2));
list.add(new ListNode(3));
list.add(new ListNode(5));
list.add(new ListNode(7));
for(int i=0;i<list.size();i++){
ListNode listNode=list.get(i);
if(i+1<list.size()){
listNode.next=list.get(i+1);
}
}
list2.add(new ListNode(2));
list2.add(new ListNode(4));
list2.add(new ListNode(6));
for(int i=0;i<list2.size();i++){
ListNode listNode=list2.get(i);
if(i+1<list2.size()){
listNode.next=list2.get(i+1);
}
}
printLsit(Merge(list.get(0),list2.get(0)));
}*/
}
非递归做法,也要熟悉
public class Solution {
public ListNode Merge(ListNode list1, ListNode list2) {
if(list1 == null) return list2;
if(list2 == null) return list1;
ListNode mergeList = null;
ListNode curNode = null;
//初始化第一个节点
if(list1.val < list2.val){
curNode = list1;
list1 = list1.next;
}else{
curNode = list2;
list2 = list2.next;
}
mergeList=curNode;
while(list1 != null && list2 != null){
if(list1.val < list2.val){
curNode.next = list1;
curNode=list1;
list1 = list1.next;
}else{
curNode.next = list2;
curNode=list2;
list2 = list2.next;
}
}
if(list1!=null)curNode.next=list1;
if(list2!=null)curNode.next=list2;
return mergeList;
}
}