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