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

我GitHub上的:剑指offer题解​​​​​​​

合并两个排序的链表

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

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

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

思路一

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

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;
}

 

测试函数:

 

public static void main(String[] args) {
	ListNode listNode1 = new ListNode(1);
	ListNode listNode2 = new ListNode(6);
	ListNode listNode3 = new ListNode(9);
	ListNode listNode4 = new ListNode(11);
	ListNode listNode5 = new ListNode(12);
	listNode1.next = listNode2;
	listNode2.next = listNode3;
	listNode3.next = listNode4;
	listNode4.next = listNode5;
		
	ListNode listNode6 = new ListNode(1);
	ListNode listNode7 = new ListNode(2);
	ListNode listNode8 = new ListNode(4);
	ListNode listNode9 = new ListNode(10);
	ListNode listNode10 = new ListNode(12);
	ListNode listNode11 = new ListNode(13);
	listNode6.next = listNode7;
	listNode7.next = listNode8;
	listNode8.next = listNode9;
	listNode9.next = listNode10;
	listNode10.next = listNode11;
		
	ListNode merge = listMerge2(listNode1, listNode6);
	ListNode head = merge;
	while (head != null) {
		System.out.print(head.val + " ");
		head = head.next;
			
	}	}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值