LeetCode第11题有序链表的合并

本文详细解析了LeetCode上的经典题目——有序链表的合并。通过迭代思想,文章提供了清晰的解题思路和代码实现,展示了如何将两个有序链表高效地合并成一个新的有序链表。

LeetCode第11题有序链表的合并

今天在力扣上看到一个比较有意思的题,虽然比较简单,但是用的方法感觉眼前一亮。
题目是这样的:
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

解题思路

这里用迭代的思想进行求解:假设存在的两个链表是两个国家,这两个国家是相互依存的关系,若一个国家为空了,则战争结束。这时定义一个哨兵节点head,该哨兵用于保存开始节点,用于返回最终的结果,而另一边定义一个pre,用于冲锋陷阵,也就是分别比较两个节点在当前节点处的值的大小,找到其中较小的那个数值节点,建立pre到该节点的链路,然后节点下移一位,pre同样也移动到新的节点位置,反复进行上述步骤,并且当其中有一个链表的节点为空的时候,结束当前循环,这是判断出是哪个链表为空,然后建立pre到该节点的链路即可。不多说,直接上代码。

class ListNodes 
{
	       int val;
	       ListNodes next;
	       ListNodes(int x) 
	       { 
	    	   val = x; 
	       }
}
	
public class code21 {
	////利用迭代的思路进行求解
	public static ListNodes mergeTwoLists(ListNodes l1, ListNodes l2) 
	{	if (l1 == null) {
        return l2;
    }
    else if (l2 == null) {
        return l1;
    }
    else if (l1.val < l2.val) {
        l1.next = mergeTwoLists(l1.next, l2);
        return l1;
    }
    else {
        l2.next = mergeTwoLists(l1, l2.next);
        return l2;
    }


    }
	/////利用迭代的思想进行求解
	public static ListNodes solution(ListNodes l1, ListNodes l2)
	{
		ListNodes m = new ListNodes(-1);////定义初始节点,该节点用于返回最终链表拼凑出来的节点,哨兵节点固定不动的哦。你就在这里给我站好岗,到时候
		ListNodes pre = m;  /////机动部队,用于将当前链表进行合并
		while(l1!=null&&l2!=null)
		{
			if(l1.val<=l2.val)////判断当前两个链表的节点大小,
			{
				pre.next = l1;////建立到节点1的连接
				l1 = l1.next;////链表1后退一个
			}
			else
			{
				pre.next = l2;  ///继续进行判断
				l2 = l2.next;
			}
			pre = pre.next;////机动部队到新的位置
		}
		pre.next = l1==null?l2:l1;  ////到大这里说明两个链表中有一个出现了空,将当前节点的连接的下一个节点连接到非空链表的第一个节点的位置
		return m.next; ///返回哨兵节点
	}
	public static void print(ListNodes node)
	{
		ListNodes cur = node;
		while(cur!=null)
		{
			System.out.print(cur.val+" ");
			cur = cur.next;
		}
	}
	public static void main(String[] args) {
		 ListNodes node1 = new ListNodes(1);
		 node1.next = new ListNodes(2);
		 node1.next.next = new ListNodes(4);
		 
		 ListNodes  node2 = new ListNodes(1);
		 node2.next = new ListNodes(3);
		 node2.next.next = new ListNodes(4);
		 print(solution(node1,node2));
		
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值