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

题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。例如输入下图中的链表1和链表2,则合并之后的升序链表如链表3所示。

二 代码实现

template <typename T>
struct Node
{
public:
T data;
Node *pNext;
}; template <typename T>
class ListEx
{
private:
Node<T> *m_pHead;
Node<T> *m_pTail;
public:
ListEx()
{
m_pTail = m_pHead = NULL;
}
~ListEx()
{
Node<T> *pTemp = NULL;
Node<T> *pNode = m_pHead;
while (pNode)
{
pTemp = pNode;
pNode = pNode->pNext;
delete pTemp;
} m_pHead = m_pTail = NULL;
}
void add(T data)
{
Node<T> *pNode = new Node<T>;
pNode->data = data;
pNode->pNext = NULL; if (m_pHead == NULL)
{
m_pTail = m_pHead = pNode;
} Node<T>* pTemp = m_pTail;
pTemp->pNext = pNode;
m_pTail = pNode;
} Node<T> *GetListHead()
{
return m_pHead;
}
};
template <typename T>
Node<T>* RebuildArray(Node<T>* pNode1, Node<T>* pNode2)
{
if (NULL == pNode1)
{
return pNode2;
}
else if (NULL == pNode2)
{
return pNode1;
}
Node<T>* pNewNode = new Node<T>;
pNewNode = NULL;
if (pNode1->data <= pNode2->data)
{
pNewNode = pNode1;
pNewNode->pNext = RebuildArray(pNode1->pNext, pNode2);
}
else
{
pNewNode = pNode2;
pNewNode->pNext = RebuildArray(pNode1, pNode2->pNext);
} return pNewNode;
}
void main()
{
ListEx<int> *pList1= new ListEx<int>();
pList1->add();
pList1->add();
pList1->add();
pList1->add();
Node<int> *pHead1 = pList1->GetListHead(); ListEx<int> *pList2= new ListEx<int>();
pList2->add();
pList2->add();
pList2->add();
pList2->add();
Node<int> *pHead2 = pList2->GetListHead(); Node<int>* p = RebuildArray(pHead1, pHead2);
}

将链表换成数组做简单的循环和递归测试

  (1)循环实现

void RebuildArray(int *a, int nLen1, int *b, int nLen2, int *pNew)
{
if (NULL == a || NULL == b || == nLen1 || == nLen2 || NULL == pNew)
{
return;
} int nIndex = ;
int i = ;
int j = ;
while (i < nLen1)
{
while (j < nLen2)
{
if (a[i] <= b[j])
{
pNew[nIndex++] = a[i++];
break;
}
else
{
pNew[nIndex++] = b[j++];
}
}
}
while(i < nLen1)
{
pNew[nIndex++] = a[i++];
}
while(j < nLen2)
{
pNew[nIndex++] = b[j++];
}
}

  (2)递归实现

void RebuildArray_2(int *aStart, int *aEnd, int *bStart, int *bEnd, int *pNew)
{
if (aStart > aEnd)
{
*pNew = *bStart;
return;
}
else if (bStart > bEnd)
{
*pNew = *aStart;
return;
}
if (*aStart <= *bStart)
{
*pNew = *aStart;
RebuildArray_2(aStart+, aEnd, bStart, bEnd, pNew+);
}
else
{
*pNew = *bStart;
RebuildArray_2(aStart, aEnd, bStart+, bEnd, pNew+);
}
}
void RebuildArray_1(int *a, int nLen1, int *b, int nLen2, int *pNew)
{
if (NULL == a || NULL == b || == nLen1 || == nLen2 || NULL == pNew)
{
return;
} int *aStart = a;
int *aEnd = &a[nLen1 - ];
int *bStart = b;
int *bEnd = &b[nLen2 - ]; RebuildArray_2(aStart, aEnd, bStart, bEnd, pNew);
}

剑指Offer面试题:13.合并两个排序的链表的更多相关文章

  1. 剑指Offer:面试题17——合并两个排序的链表

    题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 思路1: 分别用p1,p2两个指针扫描两个有序链表,p3指针去构建新链表h3. p1.val & ...

  2. 剑指Offer - 九度1519 - 合并两个排序的链表

    剑指Offer - 九度1519 - 合并两个排序的链表2013-11-30 22:04 题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则.(hi ...

  3. 剑指offer十六之合并两个排序的链表

    一.题目 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 二.思路 注:链表1和链表2是两个递增排序的链表,合并这两个链表得到升序链表为链表3. 首先分析 ...

  4. 【剑指Offer】16、合并两个排序的链表

      题目描述:   输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则.   解题思路:   首先需要判断几个特殊情况,即判断输入的两个指针是否为空.如果第一个 ...

  5. 剑指offer(16)合并两个排序的链表

    题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题目分析 重点抓住这两个链表都是单挑递增的,因此我们只需要不断地比较他们的头结点就行,明显这是个 ...

  6. 剑指Offer:面试题13——在O(1)时间删除链表结点

    问题描述: 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点.链表结点与函数的定义如下: public class ListNode{ int value; ListNode ...

  7. 【剑指offer】面试题 25. 合并两个排序的链表

    面试题 25. 合并两个排序的链表 NowCoder 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. Java 实现 ListNode Clas ...

  8. 【剑指Offer面试题】 九度OJ1518:反转链表

    与其非常快写出一段漏洞百出的代码,倒不如细致分析再写出鲁棒的代码. 提前想好測试用例(输入非空等等)进行測试改动代码. 题目链接地址: http://ac.jobdu.com/problem.php? ...

  9. C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告

    剑指offer之面试题37 两个链表的第一个公共结点 提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?t ...

随机推荐

  1. spring boot集成redis缓存

    spring boot项目中使用redis作为缓存. 先创建spring boot的maven工程,在pom.xml中添加依赖 <dependency> <groupId>or ...

  2. JVM(4) 虚拟机性能监控与故障处理工具

    1. Sun JDK 监控和故障处理工具 1)jps:JVM process Status Tool,显示指定系统内所有的HotSpot虚拟机进程.可以列出正在运行的虚拟机进程,并显示虚拟机执行主类( ...

  3. linux 相关使用总结

    1. 在centos下安装g++,如果输入 yum install g++,那么将会提示找不到g++.因为在centos下g++安装包名字叫做:gcc-c++ 所以应该输入 yum install g ...

  4. jdbc封装代码

    jdbc封装代码 package jdbcUtil; import java.sql.Connection; import java.sql.DriverManager; import java.sq ...

  5. Luogu-1975 [国家集训队]排队

    Luogu-1975 [国家集训队]排队 题面 Luogu-1975 题解 题意:给出一个长度为n的数列以及m个交换两个数的操作,问每次操作后逆序对数量 时间,下标和数的大小三维偏序,,,把交换操作看 ...

  6. vim与shell终端操作技巧

    一.快速注释多行代码 1.添加//注释符 :10,50s#^#//#g       使用#作为分隔符 2.删除//注释符 :10,50s#^//##g       使用#作为分隔符 3.添加#注释符 ...

  7. 嵌套的SQL另外一种写法

    SELECT a.TradeOrderID 二段交易号 , c.TradeOrderID 一段订单号 , a.BaggingDate AS 出库时间 , a.TransportOrderCode AS ...

  8. 《Computational Statistics with Matlab》硬译2

    T=; sigma=; thetamin=-;thetamax=; theta=zeros(,T); seed=;rand('state',seed);randn('state',seed); the ...

  9. PHP的可变变量名

    有时候可变的变量名会给编程带来很大的方便.也就是说变量名可以被动态的命名和使用.通常变量通过下面这样的语句来命名 : 1 2 3 <!--?php $a = 'hello'; ?--> 可 ...

  10. 阿里云 centOS7.4新装nginx 不能访问

    反复装了几遍ngxin,什么防火墙,nginx.conf改了好几次都不能访问外网的ip, 原因是阿里云这货新的服务器根本就没开通443,80端口,真是坑人啊 点击配置规则,增加端口就行了 添加安全规则 ...