剑指Offer(十六):合并两个排序的链表

 

 

 

一、前言

本系列文章为《剑指Offer》刷题笔记。

刷题平台:牛客网

书籍下载:共享资源

二、题目

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

1、思路

先判断输入的链表是否为空的指针。如果第一个链表为空,则直接返回第二个链表;如果第二个链表为空,则直接返回第一个链表。如果两个链表都是空链表,合并的结果是得到一个空链表。

两个链表都是排序好的,我们只需要从头遍历链表,判断当前指针,哪个链表中的值小,即赋给合并链表指针即可。使用递归就可以轻松实现。

c++:

 1 /*
 2 struct ListNode {
 3     int val;
 4     struct ListNode *next;
 5     ListNode(int x) :
 6             val(x), next(NULL) {
 7     }
 8 };*/
 9 class Solution {
10 public:
11     ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
12     {
13         //判断指针是否为空
14         if(pHead1 == NULL){
15             return pHead2;
16         }
17         else if(pHead2 == NULL){
18             return pHead1;
19         }
20         ListNode* pMergedHead = NULL;
21         if(pHead1->val < pHead2->val){
22             pMergedHead = pHead1;
23                pMergedHead->next = Merge(pHead1->next, pHead2);
24         }
25         else{
26             pMergedHead = pHead2;
27                pMergedHead->next = Merge(pHead1, pHead2->next);
28         }
29         return pMergedHead;
30     }
31 };
View Code

python:

 1 # -*- coding:utf-8 -*-
 2 # class ListNode:
 3 #     def __init__(self, x):
 4 #         self.val = x
 5 #         self.next = None
 6 class Solution:
 7     # 返回合并后列表
 8     def Merge(self, pHead1, pHead2):
 9         # write code here
10         if not pHead1:
11             return pHead2
12         if not pHead2:
13             return pHead1
14         pMergeHead = None
15         if pHead1.val < pHead2.val:
16             pMergeHead = pHead1
17             pMergeHead.next = self.Merge(pHead1.next, pHead2)
18         else:
19             pMergeHead = pHead2
20             pMergeHead.next = self.Merge(pHead1, pHead2.next)
21         return pMergeHead

 

posted @ 2019-03-27 20:07  一曲长歌  阅读(175)  评论(0)    收藏  举报