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

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

我在这个题中学到了两点。1:在Java中的=赋值对于对象来说,其实是把这个地址赋值给它。可以操作其它的实例的引用来去改变这个地址中的内容。就体现在第一种方法当中,我创建了两个节点,一个节点去创造链表,一个节点去用来保存当前的状态。2:对于每次操作没有关联都是一种重新开始的时候,可以考虑一下递归思想。这个题的简单的解法就是递归的思想。递归的时候一定要考虑好终止的条件。

我的思路

创建两个节点,一个用来去存储当前节点的第一个值,一个去作出一个链表。

我用这个方法遇到的难题是:怎么才能保存住当前节点的值,第一次尝试的时候都是在没有办法解决保存节点的问题,后来创建了两个节点。

public static ListNode Merge(ListNode list1,ListNode list2){
		ListNode result = new ListNode(-1);	
		ListNode temp1 = result;
		while(list1 != null && list2 != null){
			int temp = list1.val;
			if(temp < list2.val){
				result.next= new ListNode(list1.val);
				list1 = list1.next;
				result = result.next;
			}else if(temp == list2.val){
				result.next = new ListNode(list1.val);
				result.next.next = new ListNode(list2.val);
				list1 = list1.next;
				list2 = list2.next;
				result = result.next.next;
			}else{
				result.next = new ListNode(list2.val);
				list2 = list2.next;
				result = result.next;
			}
		}
		while(list1 != null){
			result.next = list1;
			list1 = list1.next;
			result = result.next;
		}
		while(list2 != null){
			result.next = list2;
			list2 = list2.next;
			result =result.next;
		}
		result.next = null;
		return temp1.next;
	}

书中优化的解法

即每次操作都相当于一个新的内容的时候,便可以考虑这个递归的思想。

public static ListNode simpleMerge(ListNode list1,ListNode list2){
		if(list1 == null){
			return list2;
		}
		if(list2 == null){
			return list1;
		}
		ListNode head = null;
		if(list1.val < list2.val){
			head = list1;
			head.next = simpleMerge(list1.next,list2);
		}else{
			head = list2;
			head.next = simpleMerge(list1,list2.next);
		}
		return head;
	}

猜你喜欢

转载自blog.csdn.net/weixin_43872339/article/details/87468728