原题描述
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 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 均按 非递减顺序 排列
个人解法
Java(顺序插入)
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/public ListNode mergeTwoLists(ListNode list1, ListNode list2) {ListNode p=list2;ListNode head=new ListNode(-1,list1);ListNode q=head;if (list1==null){return list2;}while (list1!=null){if(list2!=null&&list2.val> list1.val){list1=list1.next;q=q.next;}if (list1==null&&list2!=null){q.next=list2;break;}if (list2!=null&&list2.val== list1.val){if (list2.next!=null){p=list2.next;}else {p=null;}list2.next=list1.next;list1.next=list2;list2=p;list1=list1.next;q=q.next;}if (list2!=null&&list2.val<list1.val){//2 3 4 4 3if (list2.next!=null){p=list2.next;}else {p=null;}list2.next=list1;if (head.next==list1){head.next=list2;}else {q.next=list2;}list1=list2;list2=p;}if (list2==null){break;}}// if (list2!=null){// list1.next=list2;// }return head.next;}
JavaScript
/*** @param {ListNode} l1* @param {ListNode} l2* @return {ListNode}*/var mergeTwoLists = function (l1, l2) {if (l1 === null) {return l2;}if (l2 === null) {return l1;}if (l1.val < l2.val) {l1.next = mergeTwoLists(l1.next, l2);return l1;} else {l2.next = mergeTwoLists(l1, l2.next);return l2;}};
更优解法
Java
递归
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;}}
迭代
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {ListNode prehead = new ListNode(-1);ListNode prev = prehead;while (l1 != null && l2 != null) {if (l1.val <= l2.val) {prev.next = l1;l1 = l1.next;} else {prev.next = l2;l2 = l2.next;}prev = prev.next;}// 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可prev.next = l1 == null ? l2 : l1;return prehead.next;}
JavaScript
var mergeTwoLists = function(l1, l2) {const prehead = new ListNode(-1);let prev = prehead;while (l1 != null && l2 != null) {if (l1.val <= l2.val) {prev.next = l1;l1 = l1.next;} else {prev.next = l2;l2 = l2.next;}prev = prev.next;}// 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可prev.next = l1 === null ? l2 : l1;return prehead.next;};
