合并两个排序的链表(java)

合并两个排序的链表

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

思路一:新建一个链表,从前往后遍历两个链表,谁小谁先进新链表。采用递归的方式。

思路二:思路一采用的是递归的方法,思路二采用非递归的方法

思路一

新建一个链表,从前往后遍历两个链表,谁小谁先进新链表。采用递归的方式。

	
public static ListNode listMerge(ListNode list1, ListNode list2){
	if (list1 == null) return list2;//判断某个链表为空就返回另一个链表。
	if (list2 == null) return list1;
	ListNode mergeList = null;//定义一个链表作为返回值
	if (list1.val <= list2.val) {//如果list1的值比较小,就先把list1赋值给mergeList
		mergeList = list1;
		mergeList.next = listMerge(list1.next, list2);//做递归,求链表下一个结点的值
	}
	else {//如果list2的值比较小,就先把list1赋值给mergeList
		mergeList = list2;
		mergeList.next = listMerge(list1, list2.next);//做递归,求链表下一个结点的值
	}
		
	return mergeList;
}
		

可以简化一下,用三目运算符

mergeList = list1.val > list2.val ? list2:list1;
mergeList.next = list1.val > list2.val ? listMerge(list1, list2.next):listMerge(list1.next, list2);

思路二

思路一采用的是递归的方法,思路二采用非递归的方法。

public static ListNode listMerge2(ListNode list1, ListNode list2){
	if (list1 == null) return list2;//判断某个链表为空就返回另一个链表。
	if (list2 == null) return list1;
		
		
	ListNode mergeList = new ListNode(0);//为什么不是为null.因为下面要有mergeList.next
//	ListNode mergeList = null;
	ListNode temp1 = list1;
	ListNode temp2 = list2;
	ListNode head = mergeList;//保留其指针位置
	while(temp1 != null && temp2 != null){
		if (temp1.val <= temp2.val) {
			mergeList.next = temp1;
			mergeList = mergeList.next;
			temp1 = temp1.next;
		}
		else {//如果list2的值比较小,就先把list1赋值给mergeList
			mergeList.next = temp2;
			mergeList = mergeList.next;
			temp2 = temp2.next;
		}
	}//while end.其中一条链表已经遍历完
	if (temp1 != null) {
		mergeList.next = temp1;
		mergeList = mergeList.next;
		temp1 = temp1.next;
	}
	if (temp2 != null) {
		mergeList.next = temp2;
		mergeList = mergeList.next;
		temp2 = temp2.next;
	}
	mergeList = head.next;
	return mergeList;
	}

有两个链表,由于链表这种数据结构方便插入,所以我们可以在其中一个链表上进行插入另外一个链表。


猜你喜欢

转载自blog.csdn.net/Elaine1006/article/details/80168562