合并两个有序的单链表

【说明】:

本文是左程云老师所著的《程序员面试代码指南》第二章中“合并两个有序的单链表”这一题目的C++复现。

本文只包含问题描述、C++代码的实现以及简单的思路,不包含解析说明,具体的问题解析请参考原书。

感谢左程云老师的支持。

【题目】:

给定两个有序单链表的头节点 head1 和 head2,请合并两个有序链表,合并后的链表依然有序,并返回合并后链表的头节点。

例如:

0->2->3->7->NULL

1->3->5->7->9->NULL

合并后的链表为:0->1->2->3->3->5->7->7->9->NULL

【思路】:

解法:以头节点较小的链表为基准,将另一个链表插入到此链表中。

【编译环境】:

CentOS6.7(x86_64)

gcc 4.4.7

【实现】:

实现及测试代码:
合并两个有序的单链表合并两个有序的单链表

1 /*
 2  *文件名:list_merge.cpp
 3  *作者:
 4  *摘要:合并两个有序的单链表
 5  */
 6 
 7 #include <iostream>
 8 
 9 using namespace std;
10 
11 class Node 
12 {
13 public:
14     Node(int data)
15     {
16         value = data;
17         next = NULL;
18     }
19 public:
20     int value;
21     Node *next;
22 };
23 
24 Node* merge(Node *head1,Node *head2)
25 {
26     if(NULL == head1 || NULL == head2)
27         return NULL != head1 ? head1 : head2;
28     Node *head = head1->value < head2->value ? head1 : head2;
29     Node *cur1 = head == head1 ? head1 : head2;
30     Node *cur2 = head == head1 ? head2 : head1;
31     Node *pre = NULL;
32     Node *next = NULL;
33 
34     while(NULL != cur1 && NULL != cur2)
35     {
36         if(cur1->value <= cur2->value)    //以cur1 为基准,将cur2插入到cur1中
37         {
38             pre = cur1;
39             cur1 = cur1->next;
40         }
41         else    //将第二个链表的节点插入到第一个链表中
42         {
43             next = cur2->next;
44             pre->next = cur2;
45             cur2->next = cur1;
46             pre = cur2;
47             cur2 = next;
48         }
49     }
50     pre->next = NULL == cur1 ? cur2 : cur1;
51     return head;
52 }
53 
54 void printList(Node *head)
55 {
56     while(NULL != head)
57     {
58         cout << head->value << " ";
59         head = head->next;
60     }
61     cout << endl;
62 }
63 
64 int main()
65 {
66     Node *head1(NULL),*ptr1(NULL);
67     Node *head2(NULL),*ptr2(NULL);    
68     for(int i =1;i<10;i += 2)//构造链表
69     {
70         if(NULL == head1)
71         {    
72             head1 = new Node(i);
73             ptr1 = head1;
74             continue;
75         }
76         ptr1->next = new Node(i);
77         ptr1 = ptr1->next;    
78     }
79     for(int i =1;i<10;i += 2)//构造链表
80     {
81         if(NULL == head2)
82         {    
83             head2 = new Node(i);
84             ptr2 = head2;
85             continue;
86         }
87         ptr2->next = new Node(i);
88         ptr2 = ptr2->next;    
89     }
90     cout << "Before merging (head1):" << endl;
91     printList(head1);
92     cout << "Before merging (head2):" << endl;
93     printList(head2);
94     cout << "After merging:" << endl;
95     Node *head = merge(head1,head2);
96     printList(head);
97     return 0;
98 }

View Code

注:

转载请注明出处;

转载请注明源思路来自于左程云老师的《程序员代码面试指南》。
原文链接: https://www.cnblogs.com/PrimeLife/p/5450018.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/232777

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 下午3:37
下一篇 2023年2月13日 下午3:37

相关推荐