将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4]示例 2:
输入:l1 = [], l2 = [] 输出:[]示例 3:
输入:l1 = [], l2 = [0] 输出:[0]提示:
- 两个链表的节点数目范围是
[0, 50]
-100 <= Node.val <= 100
l1
和l2
均按 非递减顺序 排列
因为是升序排列,所以直接比较大小按顺序排列就行。
链表有一个常用的方法为设置哨兵,这样可以很方便的解决边界问题。首先新建一个新的链表n1,赋值为-1,再创建一个新的链表list=n1,这样list就是哨兵,帮助n1读取两个链表中的数据并合并。最终返回n1.next就是合并后的有序链表。(链表的指向直接是内存,list.next=list1相当于list的下一个节点指向了list1的当前节点,后续.next也是list1的.next,直接是内存的变化,不是单纯数据的变化)
public static ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode listNode=new ListNode(1);
ListNode list=listNode;
if(list1==null&&list2==null)return null;
else if(list1==null) {
list.next=list2;
}
else if(list2==null){
list.next=list1;
}
while(list1!=null&&list2!=null){
if(list1.val>= list2.val){
list.next=list2;
list2=list2.next;
}
else if(list1.val<list2.val){
list.next=list1;
list1=list1.next;
}
list=list.next;
}
if(list1==null&&list2!=null) {
list.next=list2;
}
else if(list2==null&&list1!=null){
list.next=list1;
}
return listNode.next;
}