这个题常规思路确实很简单,但是在考虑递归写法的时候,我又一次被打击了,真的就是一看就会,一写就废的那种!!!
题目描述:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
思路一:
最常规的思路:遍历两个链表,比对每一个节点,每次将节点值较小的串起来,思路很简单,代码人很容易。
代码:
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1==null){return l2;}
if(l2==null){return l1;}
ListNode newHead1=new ListNode(-1);
ListNode newHead=newHead1;
while(l1!=null && l2!=null)
{
while(l2!=null &&l1!=null && l1.val<=l2.val)
{
ListNode tmp1=l1.next;
newHead.next=l1;
l1=tmp1;
newHead=newHead.next;
}
while(l2!=null &&l1!=null && l2.val<=l1.val)
{
ListNode tmp2=l2.next;
newHead.next=l2;
l2=tmp2;
newHead=newHead.next;
}
}
if(l1==null)
{ newHead.next=l2; }
if(l2==null)
{newHead.next=l1;}
return newHead1.next;
}
}
思路二:递归
递归的思路其实也是每次比较两个链表当前节点值的大小,然后继续递归,可能是自己菜吧,自己真的写不出来,然后看了大佬的代码,它返回值回溯的过程也理解了半天。在这我就把大佬的代码分享一下,一块学习。
题解链接: 递归.
代码:
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode 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;
}
}
}