将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 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
均按 非递减顺序 排列
题解(双指针)
- 定义dummyHead虚拟头结点用来表示这个合并链表的头结点,然后定义一个tail用来尾插结点
- l1表示list1的数据结点,l2表示list2的数据结点
- 初始化 ListNode dummyHead= new ListNode(); tail=dummyHead; l1=list1; l2=list2;
- 当 l1.val<=l2.val , tail.next=l1 l1++ tail=tail.next
- 当l1.val>l2.val,tail.next=l2 l2++ tail=tail.next
- 当l1==null 那么tail.next=l2 程序结束
- 当l2==null 那么tail.next=l1 程序结束
JAVA实现
public ListNode mergeTwoLists(ListNode list1, ListNode list2) { if (list1==null){ return list2; //如果list1为空,直接返回list2 } if (list2==null){ return list1; //如果list2为空,直接返回list1 } ListNode dummyHead= new ListNode();//创建头结点 ListNode tail=dummyHead;//创建尾结点 ListNode l1=list1; ListNode l2=list2; while (l1!=null&&l2!=null){ if (l1.val<=l2.val){ tail.next=l1; l1=l1.next; }else { tail.next=l2; l2=l2.next; } tail=tail.next;//更新尾结点 } if (l1==null){ tail.next=l2; //如果是以l1==null结束 就要将l2剩下的结点都都链接到tail后面 }else { tail.next=l1; //如果是以l2==null结束 就要将l1剩下的结点都都链接到tail后面 } return dummyHead.next; }
题解(递归)
JAVA实现
public ListNode mergeTwoLists(ListNode list1, ListNode list2) { if (list1==null){ return list2; } if (list2==null){ return list1; } if (list1.val<=list2.val){ list1.next=mergeTwoLists(list1.next,list2); return list1; }else { list2.next=mergeTwoLists(list1,list2.next); return list2; } }