C++合并两个有序的单链表

来源:互联网 发布:刷贴软件 编辑:程序博客网 时间:2024/06/05 23:40

一直看到的都是合并的函数,却没有看到完整的输入输出啥样的,今天自己写一个,包含链表的初始化

// 合并两个有序链表.cpp : 定义控制台应用程序的入口点。#include "stdafx.h"#include <iostream>using namespace std;struct ListNode{int val;ListNode* next;};ListNode* initList1(ListNode* head){//初始化第一个链表ListNode* node1  = new ListNode();node1->val = 2;head->next = node1;ListNode* node2  = new ListNode();node2->val = 3;node1->next = node2;ListNode* node3  = new ListNode();node3->val = 6;node2->next = node3;ListNode* node4  = new ListNode();node4->val = 8;node3->next = node4;return head;}//initList1ListNode* initList2(ListNode* head){//初始化第二个链表ListNode* node1  = new ListNode();node1->val = 1;head->next = node1;ListNode* node2  = new ListNode();node2->val = 2;node1->next = node2;ListNode* node3  = new ListNode();node3->val = 4;node2->next = node3;ListNode* node4  = new ListNode();node4->val = 5;node3->next = node4;return head;}//initList2//从头至尾遍历单链表void visitList(ListNode* head){while(head!= NULL){cout<<head->val<<endl;head= head->next;}}//visitList//合并连个有序链表ListNode* mergerTwoSortedList(ListNode* head1,ListNode* head2){ListNode* head = new ListNode();//head指针是每次后移的ListNode* firstNode = head;//需要确定好一个不变的头结点,然后返回这个头结点的next地址,才能返回完成的链表while(head1!=NULL && head2!=NULL){if(head1->val > head2->val){head->next = head2;//这里只是确定好head->next是哪个结点,head还没有指向这个结点head2 = head2->next;}else{head->next = head1;    head1 = head1->next;}head = head ->next;//head指向这个结点}//whilehead->next = head1?head1:head2;//遇到一个为空后,哪个不为空就next指向哪一个//return head->next;//输出是:7 8 ,因为head指针也在往后移动return firstNode->next;}//mergerTwoSortedListint _tmain(int argc, _TCHAR* argv[])  {  //函数中初始化     cout<<"第一个链表:"<<endl; ListNode* head1  = new ListNode(); head1->val = 0;     head1 = initList1(head1); visitList(head1); cout<<"第二个链表:"<<endl; ListNode* head2  = new ListNode(); head2->val = -1;     head2 = initList2(head2); visitList(head2); cout<<"合并后的新链表:"<<endl; ListNode* head = mergerTwoSortedList(head1,head2); visitList(head); return 0;  } //第一个链表://0//2//3//6//8//第二个链表://-1//1//2//4//5//合并后的新链表://-1//0//1//2//2//3//4//5//6//8//请按任意键继续. . .

单步调试发现:

firstNode指针保存的值并没有改变,是刚开始时head的地址,

head每次在后移,地址是改变的,所以最后是return firstNode->next,才能返回完整链表









原创粉丝点击