合并两个排序的链表

本文介绍了一种合并两个已排序链表的方法,确保合并后的链表仍然保持递增顺序。提供了两种实现思路:一种是非递归方式,通过遍历并比较两个链表的元素来构建新的链表;另一种是递归方式,通过不断比较头部节点值来合并链表。

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

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

思路:1、先判断两个链表是否为空,一个为空,就直接返回另一个。然后定义两个不同节点,同时指向两个链表中最小值。保证一个头指针不动,另一个根据两链表最小值而动。直到一个链表为空,则直接将另一个链表接在后面。因为有一个静止头结点始终指向新建链表的头结点,返回它即可。

           2、两个链表都是排序好的,我们只需要从头遍历链表,判断当前指针,哪个链表中的值小,即赋给合并链表指针即可。使用递归就可以轻松实现。

 

思路1代码;

public static ListNode Merge(ListNode list1, ListNode list2) {
		if(list1==null)
			return list2;
		if(list2==null)
			return list1;
		ListNode head = new ListNode(0);
		ListNode stay_head = new ListNode(0);
		if(list1.val<=list2.val) {
			head.val = list1.val;
			list1 = list1.next;
		}
		else {
			head.val = list2.val;
			list2 = list2.next;
		}
		stay_head = head;	
		while((list1!=null)&&(list2!=null)) {	
			if(list1.val<list2.val) {
				ListNode node = new ListNode(0);
				node.val = list1.val;
				head.next = node;
//				node.next = head;   逆序
				head = node;
				list1 = list1.next;
			}
			else if(list1.val>list2.val) {
				ListNode node = new ListNode(0);
				node.val = list2.val;
				head.next = node;
				head = node;
				list2 = list2.next;
			}
			else {
				ListNode node1 = new ListNode(0);
				ListNode node2 = new ListNode(0);
				node1.val = list1.val;
				head.next = node1;
				head = node1;
				list1 = list1.next;
				node2.val = list2.val;
				head.next = node2;
				head = node2;
				list2 = list2.next;
			}
		}
		
		while(list1!=null) {
			ListNode node = new ListNode(0);
			node.val = list1.val;
			head.next = node;
			head = node;
			list1 = list1.next;
		}
		while(list2!=null) {
			ListNode node = new ListNode(0);
			node.val = list2.val;
			head.next = node;
			head = node;
			list2 = list2.next;
		}
		
		return stay_head;
	}

思路2代码:

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值