剑指offer每日一刷

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zyq11223/article/details/78637760

题目名称:

合并两个排序的链表。

题目描述:

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

链表定义:

/*
 * public class ListNode { 
 * 		int val; 
 * 		ListNode next = null;
 * 
 * 		ListNode(int val){ 
 * 			this.val = val; 
 * 		}
 * 	 }
 */

方法一:递归

	// 方法一:递归,25ms,占用内存在19M左右
	public ListNode Merge(ListNode list1, ListNode list2) {
		//list1和list2分别是两个链表的头节点
		if (list1 == null) {
			return list2;
		}
		if (list2 == null) {
			return list1;
		}
		
		//第一次if判断时,通过return语句返回合并后用作新链表的头节点
		if (list1.val <= list2.val) {
			list1.next = Merge(list1.next, list2);
				//第一次if语句之后的Merge函数用作合并链表的各个节点
			return list1;
		} else {
			list2.next = Merge(list1, list2.next);
			return list2;
		}
	}

方法二:非递归

	//非递归,32ms,占用内存15M左右
	public ListNode Merge1(ListNode list1,ListNode list2){
		if(list1 == null){
			return list2;
		}
		if(list2 == null){
			return list1;
		}
		
		ListNode head = null;//记录链表合并后的头结点
		ListNode node = null; //用作合并链表的节点,指向合并后链表的尾节点
		
		while(list1 != null && list2 != null){
			if(list1.val <= list2.val){
				if(head == null){
					head = node = list1;
				}else{
					node.next = list1;
					node = node.next;
				}
				list1 = list1.next;
			}else{
				if(head == null){
					head = node = list2;
				}else{
					node.next = list2;
					node = node.next;
				}
				list2 = list2.next;
			}
		}
		if(list1 == null){
			node.next=list2;
		}
		if(list2 == null){
			node.next = list1;
		}
		
		return head;		
	}


猜你喜欢

转载自blog.csdn.net/zyq11223/article/details/78637760