【剑指offer】16 合并两个排序的链表

题目地址:合并两个排序的链表

 

题目描述                                   

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
   

题目示例                                   

输入:
{1,3,5},{2,4,6}
返回值:
{1,2,3,4,5,6}

 

解法分析                                   

因为给出的两个链表都是单调递增的,合并后的链表也是单调不递减,所以我们只需要对比两个链表的头结点即可,若哪个链表的头结点更小,就记录在新链表中,然后该链表头结点指向后一个结点,直到两个链表都指向null。返回做记录的新链表即可。见算法1。

因为需要不断比较两个链表的头结点,所以我们也可以考虑使用递归方法,见算法2。

 

代码                                         

算法1

 1 /*function ListNode(x){
 2     this.val = x;
 3     this.next = null;
 4 }*/
 5 function Merge(pHead1, pHead2)
 6 {
 7     // write code here
 8     if(pHead1 === null) return pHead2;
 9     if(pHead2 === null) return pHead1;
10     var pHead = new ListNode(0);
11     var cur = pHead;
12     while(pHead1 && pHead2){
13         if(pHead1.val <= pHead2.val){
14             cur.next = pHead1;
15             pHead1 = pHead1.next;
16         }else{
17             cur.next = pHead2;
18             pHead2 = pHead2.next;
19         }
20         cur = cur.next;
21     }
22     cur.next = pHead1 ? pHead1 : pHead2;
23     return pHead.next;
24 }

算法2

 1 function Merge(pHead1, pHead2)
 2 {
 3     // write code here
 4     if(pHead1 === null) return pHead2;
 5     if(pHead2 === null) return pHead1;
 6     var pHead = null;
 7     if(pHead1.val <= pHead2.val){
 8         pHead = pHead1;
 9         pHead.next = Merge(pHead1.next, pHead2);
10     }else{
11         pHead = pHead2;
12         pHead.next = Merge(pHead1, pHead2.next);
13     }
14     return pHead;
15 }

 

执行结果                                   

 

posted @ 2021-01-18 11:56  月南君  阅读(73)  评论(0编辑  收藏  举报