【剑指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 }
执行结果