剑指offer-面试题17.合并两个排序的链表

题目:输入两个递增的排序的链表,合并这两个链表并使新链表中的节点仍然是

按照递增排序的。例如链表1链表2合并为链表3.

1 List1:1->3->5->7
2
3 List2:2->4->6->8
4
5 List3:1->2->3->4->5->6->7->8

链表结点定义如下:

1 struct ListNode
2 {
3     int     m_nValue;
4     ListNode* m_pNext;
5 }

其实我们可以简单梳理下流程如下:

1.两个指针分别指向List1和List2的头结点。设为ptr1和ptr2

2.比较ptr1和ptr2结点的值,ptr1<ptr2则ptr1则是合并后的链表头结点

3.ptr1向后移动一个结点此时再比较 ptr1>ptr2则将ptr2的节点插入到头结点之后

4.当ptr1或者ptr2到达末尾时 比如ptr1到达List1结尾后 若此时ptr2还未到List2结尾

   将ptr2插入到新排序的链表后面.

代码实现如下:

  1 #include <iostream>
  2 using namespace std;
  3
  4 struct ListNode
  5 {
  6     int data;
  7     struct ListNode *next;
  8 };
  9
 10 struct ListNode* CreateList()
 11 {
 12     struct ListNode* Head,*p;
 13     Head=(struct ListNode*)malloc(sizeof(ListNode));
 14     Head->data=0;
 15     Head->next=NULL;
 16     p=Head;
 17
 18     cout<<"Create List....(0-exit!)"<<endl;
 19     while(true)
 20     {
 21         int Data;
 22         cin>>Data;
 23         if(Data!=0)
 24         {
 25             struct ListNode* NewNode;
 26             NewNode=(struct ListNode*)malloc(sizeof(ListNode));
 27             NewNode->data=Data;
 28             NewNode->next=NULL;
 29             p->next=NewNode;
 30             p=p->next;
 31         }
 32         else
 33         {
 34             break;
 35         }
 36     }
 37
 38     return Head->next;
 39 }
 40
 41 void PrintList(struct ListNode* Head)
 42 {
 43     cout<<"The List is: ";
 44
 45     struct ListNode *p;
 46     p=Head;
 47     while(p!=NULL)
 48     {
 49         cout<<p->data<<" ";
 50         p=p->next;
 51     }
 52     cout<<endl;
 53 }
 54
 55 struct ListNode* Merge(ListNode* pHead1,ListNode* pHead2)
 56 {
 57     if(pHead1==NULL&&pHead2==NULL)
 58         return NULL;
 59
 60     if(pHead1==NULL&&pHead2!=NULL)
 61         return pHead2;
 62
 63     if(pHead1!=NULL&&pHead2==NULL)
 64         return pHead1;
 65
 66     struct ListNode *ptr1,*ptr2,*MergeList,*newhead;;
 67
 68     ptr1=pHead1;
 69     ptr2=pHead2;
 70
 71     if(ptr1->data>ptr2->data)
 72     {
 73         MergeList=ptr2;
 74         ptr2=ptr2->next;
 75     }
 76     else
 77     {
 78         MergeList=ptr1;
 79         ptr1=ptr1->next;
 80     }
 81
 82     newhead=MergeList;
 83
 84     while(ptr1!=NULL&&ptr2!=NULL)
 85     {
 86         if(ptr1->data>ptr2->data)
 87         {
 88             MergeList->next=ptr2;
 89             ptr2=ptr2->next;
 90             MergeList=MergeList->next;
 91         }
 92
 93         if(ptr1->data<ptr2->data)
 94         {
 95             MergeList->next=ptr1;
 96             ptr1=ptr1->next;
 97             MergeList=MergeList->next;
 98         }
 99     }
100
101     if(ptr1!=NULL)
102     {
103         while(ptr1!=NULL)
104         {
105             MergeList->next=ptr1;
106             ptr1=ptr1->next;
107             MergeList=MergeList->next;
108         }
109         MergeList->next=NULL;
110     }
111     if(ptr2!=NULL)
112     {
113         while(ptr2!=NULL)
114         {
115             MergeList->next=ptr2;
116             ptr2=ptr2->next;
117             MergeList=MergeList->next;
118         }
119         MergeList->next=NULL;
120     }
121
122
123     return newhead;
124 }
125
126 int main()
127 {
128     ListNode *List1,*List2,*MergeList;
129     List1=CreateList();
130     PrintList(List1);
131     List2=CreateList();
132     PrintList(List2);
133     MergeList=Merge(List1,List2);
134     PrintList(MergeList);
135     return 0;
136 }

运行截图:

时间: 2024-10-10 04:28:31

剑指offer-面试题17.合并两个排序的链表的相关文章

剑指offer面试题17——合并两个排序的链表

题目1519:合并两个排序的链表 题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则.(hint: 请务必使用链表.) 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为两个整数n和m(0<=n<=1000, 0<=m<=1000):n代表将要输入的第一个链表的元素的个数,m代表将要输入的第二个链表的元素的个数.下面一行包括n个数t(1<=t<=1000000):代表链表一中的元素.接

剑指offer之面试题17合并两个排序的链表

问题描述: 输入两个递增的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的. 实现代码如下: #include <stdio.h> #include <stdlib.h> #include <stdbool.h> struct List{ int date; struct List *next; }; struct List* doMergeList(struct List *P1head,struct List *P2head){ if(P1head==NU

剑指offer 面试题17—合并两个排序的链表

题目: 输入两个递增排序的链表,合并这两个链表并使得新链表中的节点仍然是按照递增排序的. 基本思想: 当我们得到两个链表中值较小的头结点并把它连接到已经合并的链表之后,两个链表剩余的节点依然是排序的,因此合并的步骤和之前的而不周是一样的.这就是典型的递归的过程. #include <iostream> using namespace std; typedef int ElemType;//数据类型模板 typedef struct Node//结点 { ElemType data; struc

剑指offer_面试题17_合并两个排序的链表(两种思维)

题目:输入两个递增排序的链表,合并这两个链表,并使新链表中的结点仍然是按照递增排序的. 第一种思维:合并两个排序的链表,类似于合并两个排序数组,所不同的仅是一个用链表保存数据,一个用数组保存数据. 算法如下:(下面的算法前提是:头结点 不是 链表的第一个数据节点.) /**方法一:合并两个排序链表,使用了新创建的链表来保存,没有改动两个原始链表*/ ListNode *merge_tow_list(ListNode *pHead1,ListNode *pHead2) { if(NULL == p

剑指offer系列源码-合并两个排序的链表

题目1519:合并两个排序的链表 时间限制:1 秒内存限制:128 兆特殊判题:否提交:1309解决:615 题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. (hint: 请务必使用链表.) 输入: 输入可能包含多个测试样例,输入以EOF结束. 对于每个测试案例,输入的第一行为两个整数n和m(0<=n<=1000, 0<=m<=1000):n代表将要输入的第一个链表的元素的个数,m代表将要输入的第二个链表的元素的个数. 下面

剑指offer系列10:合并两个排序的链表

我拿到这个题的时候举的例子是链表1:1.3.5.7和链表2:2.4.6.8.我的思路是以:1为基础,将表2的每个结点插入表1.也就是说我一次性是要给新建立的链表中加入两个元素,分别是两个原始链表的头结点.这个思路我做了半天头脑一片混乱,中间指针实在不知道怎么弄了.于是我去睡了一觉,哈哈,我大概是这个世界上最会逃避的人了…… 看了答案使用了递归的方法,其实我做的时候我有想到要用递归,但是没用的原因是我一般写代码不喜欢用递归,原因有两个,一个是递归容易死循环,一个是递归的复杂度太高.但这道题真的太适

《剑指Offer》题目:合并两个排序的链表

题目描述:输入两个单调递增的链表list1,list2,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题目分析: 1.对于链表题目,首先考虑边界情况,即链表为空的情况,提升代码的鲁棒性. 2.合并完一个结点后,剩余的链表仍然是有序的,再合并下一个结点时的过程是一样的,这是一种递归的思想,因此采用递归来合并. Java代码: public class MergeSortedList { public ListNode Merge(ListNode list1,ListNod

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

题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 解法一:使用ArrayList 1 public static ListNode Merge(ListNode list1,ListNode list2) { 2 if(list1==null||list2==null){ 3 if(list1==null){ 4 return list2; 5 }else{ 6 return list1; 7 } 8 } 9 ArrayList<ListNo

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

题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 解题代码: /*function ListNode(x){ this.val = x; this.next = null; }*/ function Merge(pHead1, pHead2) { // write code here if(pHead1 == null && pHead2 == null){ return null; } if(pHead1 == null){ ret

面试题 17:合并两个排序的链表

题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按 照递增排序的. 两个指针指向两个链表的头结点,取其中值小的作为新链表的头结点,和之前的结点串联,如此递归. 注意用例: 两个链表都为null: 其中一个链表为null: 两个链表有多个结点,有相同的值,不同的值. package offer; /*面试题 17:合并两个排序的链表 题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按 照递增排序的.*/ public class Problem17 { st