leetcode-21 merge-two-sorted-lists(罗马数字转整数)

先看一下题目描述:

这是一道查看链表知识的算法题,要求非常简单,合并两个有序链表,但是这道题我理解起来非常吃力,花了很久也不能说理解透了。可能对链表的理解还是不够深刻。这道题有两个解法,递归解法和非递归解法。其中递归解法思路非常犀利,如果对递归思想没吃透的话很难想到。先看非递归版本的:

 1     public static Node mergeTwoLists(Node L1, Node L2)  {
 2         Node dummy = new Node(0);
 3         Node lastNode = dummy;
 4         
 5         while(L1!=null&L2!=null){
 6             if(L1.val<L2.val){
 7                 lastNode.next = L1;
 8                 L1 = L1.next;
 9             }
10             else{
11                 lastNode.next = L2;
12                 L2 = L2.next;
13             }
14             lastNode = lastNode.next;
15         }
16         if(L1!=null){
17             lastNode.next = L1;
18         }
19         else{
20             lastNode.next = L2;
21         }
22         return dummy.next;
23         }

注意这里用到了两个指针lastNode和dummy,lastNode指针是动态的,它随着Node1链表和Node2链表Val值大小对比而不断变化,而dummy是静态的,他永远指向合并后的新链表的头节点。如果去掉了dummy指针,那么lastNode就只剩下一个单节点的链表了。

 

 

 

递归版本:

 1 public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
 2                 if(l1 == null)return l2;
 3                 if(l2 == null)return l1;
 4                 
 5                 if(l1.val < l2.val){
 6                     l1.next = mergeTwoLists(l1.next,l2);
 7                     return l1;
 8                 }else{
 9                     l2.next = mergeTwoLists(l1,l2.next);
10                     return l2;
11                 }
12             }

 

无比的犀利,但是我并没有完全理解它。希望可以多看一看,迟早理解它

 

T

posted @ 2018-11-21 14:55  青衫z  阅读(105)  评论(0)    收藏  举报