标签:链表
 
题目描述
 
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
 
解题思路
 
两种解法:递归和非递归
 
递归:注意递归终止条件,还有递归方向,其实很好想,不要钻牛角尖非递归解法第一个是我自己写的,很冗余,第二个是别人精简的代码,忘借鉴我一开始的思路是,分list1 < list2和list1 >= list2,但又考虑到可能list1一直小,就加个内层循环,然后越来越复杂其实就两种点:判断大小,要不1<2,要不2<=1,一轮下来,指针往后走就行了,然后定义一个新头结点和当前节点(cur永远在比较大小的两个节点前,非空)。 
拓展
 
LeetCode 23:合并k个排序链表,牛客地址 
参考代码
 
递归解法 
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;
	}
}
 
别人优秀的非递归代码 
//非递归
public ListNode Merge2(ListNode list1, ListNode list2) {
	if(list1 == null)
		return list2;
	if(list2 == null)
		return list1;
	//定义两个指针
	ListNode mergeHead = null;
	ListNode current = null;
	
	while(list1!=null && list2!=null) {
		if(list1.val < list2.val) {
			if(mergeHead == null) {
				mergeHead = current = list1;
			}else {
			    //current永远是当前节点,不为空
				current.next = list1;
				current = current.next;
			}
			//为什么要放在外面,循环要终止
			list1 = list1.next;
		}else {
			if(mergeHead == null) {
				mergeHead = current = list2;
			}else {
				current.next = list2;
				current = current.next;
			}
			list2 = list2.next;
		}
	}
	if(list1 == null)
		current.next = list2;
	if(list2 == null)
		current.next = list1;
	return mergeHead;
}
 
非递归,自己第一次写的 
public ListNode Merge3(ListNode list1,ListNode list2) {
    if( list1 == null)
        return list2; 
    if(list2 == null)
        return list1;
    
    ListNode head = list1.val <= list2.val ? list1 :list2;
    ListNode last = null;
    while(list1 != null && list2 != null){
    	//System.out.println(list1.val);
        while(list1!=null && list1.val <= list2.val){
             if(list1.next!=null && list1.next.val >= list2.val){
                ListNode temp = list1.next;
                list1.next = list2;
                list1 = temp; 
             }else{
                 if(list1.next == null)
                     last = list1;
                 list1 = list1.next;
             }
        }
        while(list2!=null && list1!=null && list2.val < list1.val){
        	//System.out.println(list2.val);
            if(list2.next!=null && list2.next.val >= list1.val){
                ListNode temp = list2.next;
                list2.next = list1;
                list2 = temp;                    
            }else{
                if(list2.next == null)
                    last = list2;
                list2 = list2.next;
            }
        }        
    }
    if(list1 != null)
        last.next = list1;
    if(list2 != null)
        last.next = list2;
    return head;               
}
 
自己第二次写的 
//非递归
public ListNode Merge4(ListNode list1, ListNode list2) {
	if(list1 == null)
		return list2;
	if(list2 == null)
		return list1;
		
	//定义新的头结点和当前节点
    ListNode mergeHead = null;
    if(list1.val <= list2.val){
        mergeHead = list1;
        list1 = list1.next;
    }else{
        mergeHead = list2;
        list2 = list2.next;
    }
    //当前节点,永远在比较的两个节点前,非空
	ListNode current = mergeHead;
	
	while(list1!=null && list2!=null) {
		if(list1.val < list2.val) {
			current.next = list1;
			list1 = list1.next;
		}else{
			current.next = list2;
			list2 = list2.next;
		}
		current = current.next;
	}
	if(list1 == null)
		current.next = list2;
	if(list2 == null)
		current.next = list1;
	return mergeHead;
}
 
还能再改进 
public ListNode Merge5(ListNode list1, ListNode list2) {
	if(list1 == null)
		return list2;
	if(list2 == null)
		return list1;
	//定义新的空头节点和当前节点
    ListNode mergeHead = new ListNode(0);
	ListNode current = mergeHead;
	
	while(list1!=null && list2!=null) {
		if(list1.val < list2.val) {
			current.next = list1;
			list1 = list1.next;
		}else{
			current.next = list2;
			list2 = list2.next;
		}
		current = current.next;
	}
	if(list1 == null)
		current.next = list2;
	if(list2 == null)
		current.next = list1;
	return mergeHead.next;
}