算法题006 -- [将两个排序的链表合并,返回一个新链表,返回的新链表也是排好序的] by java

本文介绍了一种将两个已排序链表合并成一个有序链表的算法。通过两种方法实现:迭代和递归。迭代方法使用指针跟踪新链表的当前位置,而递归方法则通过比较节点值并调整连接来构建新链表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

将两个排序的链表合并,返回一个新链表,返回的新链表也是排好序的

代码

package algorithm6;

public class Algorithm6 {
	
	public static void main(String[] args) {
		ListNode merge = mergeListNodesBySelf(getListNode1(), getListNode4());
		System.out.println(merge.toString());;
	}
	
	/**方法一:不打算实现的方法
	 * 思路:第一反应的思路,就是利用一个数组
	 * 		分别遍历两个链表,将所有数据存放到数组中
	 * 		然后再对数组进行排序
	 * 		最后利用排好序的数组,构建链表
	 * 
	 */
	
	
	/**方法二:
	 * 思路:合并两个已经排序的链表,其实就是同时遍历两个链表
	 * 		在遍历链表的过程中,比较两个链表当前节点的大小,并组成新的链表
	 * 		那么在遍历的过程中,就需要有一个节点代表新的链表;
	 * 		还需要一个节点代表新链表将要被赋值的位置节点,这个节点是需要随着遍历而不断更新,才能保证是最新位置
	 * 		遍历过程中,按照节点大小对比,判定需要前进的链表
	 * 优点:思路清晰简单,时间复杂度自然就是 O(n)
	 * 
	 * @param listNode1
	 * @param listNode2
	 * @return
	 */
	public static ListNode mergeListNodes(ListNode listNode1, ListNode listNode2) {
		if(listNode1 == null) return listNode2;
		if(listNode2 == null) return listNode1;
		ListNode pointer = new ListNode(0);
		ListNode head = pointer;
		while(listNode1 != null && listNode2 != null) {
			if(listNode1.content < listNode2.content) {
				pointer.next = listNode1;
				pointer = pointer.next;
				listNode1 = listNode1.next;
			}else {
				pointer.next = listNode2;
				pointer = pointer.next;
				listNode2 = listNode2.next;
			}
		}
		if(listNode1 == null && listNode2!= null) {
			pointer.next = listNode2;
		}
		if(listNode2 == null&& listNode1!= null) {
			pointer.next = listNode1;
		}
		return head.next;
	}
	
	/**方法三:
	 * 思路:递归,一种思路清晰,但是编码却有一定难度的解法
	 * 		对两个链表的节点做比较,返回较小的节点,再为该节点的next节点赋值;
	 * 		所谓赋值就是,将较小的链表推进一位,在与另外一个链表节点继续比较;
	 * 		最终遍历完两个链表的所有节点,程序自然也就结束了
	 * 优点:思路清晰,时间复杂度依然是 O(n)
	 * 
	 * @param listNode1
	 * @param listNode2
	 * @return
	 */
	public static ListNode mergeListNodesBySelf(ListNode listNode1, ListNode listNode2) {
		if(listNode1 == null) return listNode2;
		if(listNode2 == null) return listNode1;
		ListNode head = null;
		if(listNode1.content < listNode2.content) {
			head =  listNode1;
			head.next = mergeListNodesBySelf(listNode1.next, listNode2);
		}else {
			head =  listNode2;
			head.next = mergeListNodesBySelf(listNode1, listNode2.next);
		}
		return head;
	}
	
	public static ListNode getListNode1() {
		ListNode listNode1 = new ListNode(1);
		ListNode listNode3 = new ListNode(3);
		ListNode listNode5 = new ListNode(5);
		ListNode listNode7 = new ListNode(7);
		ListNode listNode9 = new ListNode(9);
		ListNode listNode12 = new ListNode(12);
		listNode1.next = listNode3;
		listNode3.next = listNode5;
		listNode5.next = listNode7;
		listNode7.next = listNode9;
		listNode9.next = listNode12;
		return listNode1;
	}
	
	public static ListNode getListNode2() {
		ListNode listNode2 = new ListNode(2);
		ListNode listNode4 = new ListNode(4);
		ListNode listNode6 = new ListNode(6);
		ListNode listNode8 = new ListNode(8);
		ListNode listNode10 = new ListNode(10);
		listNode2.next = listNode4;
		listNode4.next = listNode6;
		listNode6.next = listNode8;
		listNode8.next = listNode10;
		return listNode2;
	}
	
	public static ListNode getListNode3() {
		return null;
	}
	
	public static ListNode getListNode4() {
		ListNode listNode2 = new ListNode(1);
		ListNode listNode4 = new ListNode(4);
		ListNode listNode8 = new ListNode(8);
		ListNode listNode10 = new ListNode(13);
		listNode2.next = listNode4;
		listNode4.next = listNode8;
		listNode8.next = listNode10;
		return listNode2;
	}
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值