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 }
无比的犀利,但是我并没有完全理解它。希望可以多看一看,迟早理解它


浙公网安备 33010602011771号