一、题目
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
二、解题方法
方法一:迭代
1.思路:
定义一个新节点,用于指向两个链表节点比较中小的节点
2.代码:
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode prehead=new ListNode(-1);//定义哨兵节点prehead便于后面找到头结点的位置
ListNode prev=prehead;//定义节点prev和prehead指向的头结点一样,通过prev实现链表节点大小比较合并
while(list1!=null&&list2!=null){
if(list1.val<=list2.val){
prev.next=list1;//prev节点指向较小的
list1=list1.next;//list1所在节点较小,则list1往后移再比较
prev=prev.next;//prev指向完也往后移
}
else{
prev.next=list2;
list2=list2.next;
prev=prev.next;
}
}
prev.next=list1==null?list2:list1;//如果有一个链表的节点为空了,则指向另外一个
return prehead.next;//注意返回的是prehead.next,prehead为-1
}
}
方法二:递归
1.思路:
判断list1和list2哪一个头结点的值更小,然后递归决定下一个连接的值,有一个链表为空,则接另外一个链表节点。
2.代码:
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
if(list1==null)
return list2;
else if(list2==null)
return list1;//如果有其中一个链表为空,则直接返回另外一个链表
else if(list1.val<list2.val){
list1.next=mergeTwoLists(list1.next,list2);
return list1;//接上list1链表,后面递归了是list1.next为链表开头
}else{
list2.next=mergeTwoLists(list2.next,list1);
return list2;
}
}
}
理解:
1 2 4和1 3 4
1和1比较,return2,134
1和3比较,return1,1124
2和3比较,return1,1124
4和3比较,return2,11234
4和4比较,return2,11234
4和null比较,return1,112344
则从后面依次返回<-1<-2<-3<-4<-4
三、补充
如果是指针变量*则用 '->' 指向next,如果是结构体变量则用 '.' 指向next
题目来源:力扣
代码参考:力扣官方题解