想法:
1.迭代
设两个指针pa和pb,不断移动pa和pb,并进行比较,则将较小元素接到新链表,该过程直至pa或pb为null,之后将未空的接到已空之后,得到升序链表
 
 1 //官方:
 2 class Solution {
 3     public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
 4         ListNode prehead = new ListNode(-1);
 5 
 6 
 7         ListNode prev = prehead;
 8         while (l1 != null && l2 != null) {
 9             if (l1.val <= l2.val) {
10                 prev.next = l1;
11                 l1 = l1.next;
12             } else {
13                 prev.next = l2;
14                 l2 = l2.next;
15             }
16             prev = prev.next;
17         }
18 
19 
20         // 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可
21         prev.next = l1 == null ? l2 : l1;
22 
23 
24         return prehead.next;
25     }
26 }
27 
28 
29 作者:LeetCode-Solution
30 链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/solution/he-bing-liang-ge-you-xu-lian-biao-by-leetcode-solu/
31 来源:力扣(LeetCode)
32 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

我写的:

 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 
13     public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
14         ListNode start = new ListNode(-1);
15         ListNode q = start;
16         if(list1==null || list2==null){//输入为空时
17             if(list1==null){
18                 return list2;
19             }else{
20                 return list1;
21             }
22         }
23 
24         //设两个指针pa和pb,不断移动pa和pb,并进行比较,则将较小元素接到新链表,该过程直至pa或pb为null
25         while(list1!=null && list2!=null){
26             if(!(list1.val>list2.val)){
27                 //list1<=list2
28                 q.next = list1;
29                 list1 = list1.next;
30             }else{//list1>list2
31                 q.next = list2;
32                 list2 = list2.next;
33             }
34             q = q.next;
35         }
36         
37         //之后将未空的接到新链表之后,得到完整升序链表
38         q.next = list1 == null ? list2 : list1;
39         return start.next;
40     }
41 }

 

2.递归(官方另解)
 
我们直接将以上递归过程建模,同时需要考虑边界情况。
 
如果 l1 或者 l2 一开始就是空链表 ,那么没有任何操作需要合并,所以我们只需要返回非空链表。否则,我们要判断 l1 和 l2 哪一个链表的头节点的值更小,然后递归地决定下一个添加到结果里的节点。如果两个链表有一个为空,递归结束。
 
 
 1 class Solution {
 2     public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
 3         if (l1 == null) {
 4             return l2;
 5         } else if (l2 == null) {
 6             return l1;
 7         } else if (l1.val < l2.val) {
 8             l1.next = mergeTwoLists(l1.next, l2);
 9             return l1;
10         } else {
11             l2.next = mergeTwoLists(l1, l2.next);
12             return l2;
13         }
14     }
15 }
16 
17 
18 作者:LeetCode-Solution
19 链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/solution/he-bing-liang-ge-you-xu-lian-biao-by-leetcode-solu/
20 来源:力扣(LeetCode)
21 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

 

posted on 2022-08-01 13:54  Jolyne123  阅读(87)  评论(0编辑  收藏  举报