题目描述:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 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 均按 非递减顺序 排列
解题思路:
1.递归的思路
递归出口:两链表其中一个为空表时,则L.next=非空链表。
若L1.val(链表节点的值)<L2.val,则递归调用合并函数 Merge(L1.next,L2)
相反同上,
1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * int val; 5 * ListNode next; 6 * ListNode() {} 7 * ListNode(int val) { this.val = val; } 8 * ListNode(int val, ListNode next) { this.val = val; this.next = next; } 9 * } 10 */ 11 class Solution { 12 public ListNode mergeTwoLists(ListNode l1, ListNode l2) { 13 14 if(l1==null){ 15 return l2; 16 } 17 else if(l2==null){ 18 return l1; 19 } 20 else if(l1.val<l2.val){ 21 l1.next=mergeTwoLists(l1.next, l2); 22 return l1; 23 } 24 else{ 25 l2.next=mergeTwoLists(l1,l2.next); 26 return l2; 27 } 28 29 30 } 31 }
2.迭代
设置一个节点prehead用于保存链表开头,设置preve指针从而维护next指针
1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * int val; 5 * ListNode next; 6 * ListNode() {} 7 * ListNode(int val) { this.val = val; } 8 * ListNode(int val, ListNode next) { this.val = val; this.next = next; } 9 * } 10 */ 11 class Solution { 12 public ListNode mergeTwoLists(ListNode l1, ListNode l2) { 13 //设置头节点,并赋值为-1 14 ListNode prehead=new ListNode(-1); 15 //设置prev节点 16 ListNode prev=prehead; 17 while(l1!=null&&l2!=null){ 18 if(l1.val<=l2.val){ 19 prev.next=l1; 20 l1=l1.next; 21 } 22 else{ 23 prev.next=l2; 24 l2=l2.next; 25 } 26 prev=prev.next; 27 } 28 if(l1==null){ 29 prev.next=l2; 30 } 31 else{ 32 prev.next=l1; 33 } 34 return prehead.next; 35 } 36 }
浙公网安备 33010602011771号