【Java】 剑指offer(25) 合并两个排序的链表

本文参考自《剑指offer》一书,代码采用Java语言。html

更多:《剑指Offer》Java实现合集  java

题目 

  输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。函数

思路

  递归实现:合并过程当中,每次都是从两个链表中找出较小的一个来连接,所以能够采用递归来实现:当任意一个链表为null时,直接连接另外一个链表便可;其他状况只须要在两个链表中找出较小的一个结点进行连接,该结点的next值继续经过递归函数来连接。post

  非递归实现:非递归实现比较容易想到,直接进行分状况讨论便可,要稍微注意下后面代码中头结点的赋值过程。测试

测试算例 this

  1.功能测试(两个链表有多个或一个结点;结点值相同、不一样)url

  2.特殊测试(任意一个或者两个链表的头结点为null)spa

Java代码

//题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按
//照递增排序的。

public class MergeSortedLists {
	public class ListNode{
		int val;
		ListNode next=null;
		public ListNode(int val) {
			this.val=val;
		}		
	}
    
	/*
	 * 递归版本
	 */
    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 dummyHead=new ListNode(0);  //不能为null
    	ListNode p=dummyHead;
    	while(list1!=null && list2!=null){
            if(list1.val<list2.val){
                p.next=list1;
                list1=list1.next;
            }else{
                p.next=list2;
                list2=list2.next;
            }
            p=p.next;
        }
    	if(list1==null)
    		p.next=list2;
    	else
    		p.next=list1;
    	return dummyHead.next;
    }
}

    

收获

  1.递归仍是不够熟悉,第一反应想到的仍是非递归实现。注意每次操做相同时,要当即考虑到能够采用递归来进行实现。htm

  2.递归实现时,须要注意连接的问题。blog

  

更多:《剑指Offer》Java实现合集 

相关文章
相关标签/搜索