合并两个排序的链表


题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

方法一(递归)
合并过程中,首先比较两个链表的首节点哪个小,较小的节点作为合成链表的首节点,之后将指针指向较小节点的后一个节点,再次进行上面逻辑的比较,可以发现比较过程是一个递归的操作。

    public ListNode Merge(ListNode list1,ListNode list2) {
    	
    	if(list2 == null) {
    		return list1;
    	}
    	else if(list1 == null) {
    		return list2;
    	}
    	
    	ListNode listAll = null;
    	
    	if(list1.val < list2.val) {
    		listAll = list1;
    		listAll.next = Merge(list1.next, list2);
    	}
    	else {
    		listAll = list2;
    		listAll.next = Merge(list1, list2.next);
    	}

    	return listAll;
    	
    }

通过递归到最大的节点,并进行返回递归操作到上一次递归的空间,将返回节点作为当前次大节点的下一个节点,这样从后到前返回到第一个节点的空间,递归操作完成。

方法二(非递归)

    public ListNode Merge_2(ListNode list1,ListNode list2) {
    	if(list2 == null) {
    		return list1;
    	}
    	else if(list1 == null) {
    		return list2;
    	}
    	
    	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;

    }

注意声明mergeHead来作为合成链表的头结点,声明current来作为一个当前合成链表最后一个节点的指针,初始化指向头结点,之后比较两个链表对应元素大小,并修改两个两个链表和current的指针指向。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM