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

浙公网安备 33010602011771号